0

我有 2 个数组,每个数组有 1000 个键,一个保存温度值,另一个保存小时。

示例数组临时:

[0] = 3.1
[1] = 4.3
[2] = 4.1
[3] = 5.1
[4] = 4.1

小时数组示例:

[0] = 0
[1] = 1
[2] = 2
[3] = 3
[4] = 3

这样做的问题是,当我将这些组合到数组中并将其绘制在例如 pchart 中时,我在 X 上有太多值并且它变得混乱。
所以我需要删除重复的时间并用“NULL”替换,这样不需要的时间就不会绘制在 x 轴上。
我想保留数组中的第一个小时,重复的第二个到末尾可以设置为“NULL”

小时输出数组应为:

[0] = 0
[1] = 1
[2] = 2
[3] = 3
[4] = NULL
etc.
4

5 回答 5

3

听起来像是一份工作array_unique()

array array_unique ( array $array [, int $sort_flags = SORT_STRING ] )

接受一个输入数组并返回一个没有重复值的新数组。

请注意,密钥是保留的。array_unique() 首先对作为字符串处理的值进行排序,然后将保留每个值遇到的第一个键,并忽略所有后续键。这并不意味着将保留未排序数组中第一个相关值的键。

注意:当且仅当 时,两个元素被认为相等(string) $elem1 === (string) $elem2。换句话说:当字符串表示相同时。将使用第一个元素。


如果您需要保留数组键,您可以尝试使用array_map().

<?php

//Variable initialization
$array = array(
    0 => 0,
    1 => 1,
    2 => 2,
    3 => 3,
    4 => 3
);
$temp  = array();

$array = array_map(function($element) use (&$temp) {
    if (!in_array($element, $temp)) {
        $temp[] = $element;
        return $element;
    }
    return null;
}, $array);

print_r($array);
于 2012-05-03T16:59:47.837 回答
2

您的数组已排序,所以... 这个怎么样?

$hours = array(0,1,2,3,3,4,4,5);
$prev = -1;
foreach ($hours as &$hour) {
  if ($prev === $hour) {
    $hour = NULL;
  }
  else {
    $prev = $hour;
  }
}
unset($hour);
print_r($hours); // 0,1,2,3,NULL,4,NULL,5...
于 2012-05-03T17:05:24.270 回答
1

如果您使用的是 php 5.3:

$a = array(0,1,2,3,4,4,5);

array_walk($a, function(&$item) {
  static $encountered = array();
  if(in_array($item, $encountered)) {
    $item = null;
    return;
  }
  $encountered[] = $item;
});

var_dump($a);

将保留键的数量。Array_walk 为每个键调用一个用户函数。static 使得函数范围内的 $encountered 数组在执行之间保持不变。

于 2012-05-03T17:05:07.963 回答
0

如果您想完全删除重复项,您可以使用array_unique() 但它不会将它们设置为 NULL。

于 2012-05-03T17:01:09.397 回答
-2

也许这个技巧可以做到:

$simplified = array_combine($hours, $temperatures);

$hours = array_keys($simplified);
$temperatures = array_values($simplified);

这不会将事物设置为 NULL 而是完全删除它们,我认为这是您正在寻找的。否则应该这样做:

foreach(array_slice(array_reverse(array_keys($hours)), 0, -1) as $i)
    ($hours[$i] === $hours[$i-1]) && $hours[$i] = NULL;

演示

于 2012-05-03T17:02:02.780 回答