PHP:重复值删除

时间:2012-05-03 16:57:57

标签: php arrays pchart

我有2个数组,例如1000个密钥,一个保存温度值,另一个保持小时。

示例数组temp:

[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.

5 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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...

答案 2 :(得分: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使得函数范围内的$ encounter数组保持在执行之间。

答案 3 :(得分:0)

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

答案 4 :(得分:-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;

Demo