2012-05-03 204 views
0

我有兩個數組,例如1000個密鑰的每個,一個持有溫度值,另一個小時。PHP:重複值刪除

例陣列溫度:

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

回答

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... 
+0

完美,似乎工作得很好:) – HyperDevil

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

可能是,但我需要在這兩個數組中保持相同數量的鍵。小時數組中的重複鍵需要設置爲NULL,而不是刪除。 – HyperDevil

+0

@HyperDevil:編輯我的答案。將嘗試找出比全局更好的方法。 –

+0

@hakre謝謝 –

-2

也許這招做的:

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

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

這不會把事情爲NULL,但完全刪除它們,我認爲這是你在找什麼。如果您使用PHP 5.3

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

Demo

+0

我需要它,所以被設置爲NULL,不會被刪除.. – HyperDevil

+0

我不知道你真的需要。試一試並回報(除非你不測試這個,我不會相信你:)) – hakre

+0

這兩種方法比使用'array_unique()'更好/不同? –

1

$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爲每個鍵調用一個用戶函數。靜態使得它在函數的作用域中遇到的$數組停留在執行之間。