2014-06-15 82 views
3

我建立的應用程序,用戶告訴它是的,哪些是鈔票當我加大與X總和。一切都很好,但我想知道我現在可以如何獲取添加和刪除的數組項目列表?找出哪些添加和已刪除項目在數組

$old = array(1,5,10); 
$new = array(1,5,1); 

$added = array_diff($new,$old); 
$removed = array_diff($old,$new); 

而這就是上面的代碼返回:

  • $addedarray()。不正確,應該是array([2] => 1)
  • $removedarray([2] => 10)。正確。

我在做什麼錯,我該如何解決?

+0

值1是在兩個數組,這就是問題... – sinisake

回答

2
$added = array_diff($new,$old); 

在上述語句中,array_diff()比較$new$old和那些不$old返回$new的值。沒有這樣的值,因此它返回一個空數組。

總之,array_diff()不適用於重複值。你將不得不編寫一個自定義函數來實現這一點。這裏的an example

function array_diff_once($array1, $array2) { 
    foreach($array2 as $val) { 
     if (false !== ($pos = array_search($val, $array1))) { 
      unset($array1[$pos]); 
     }  
    } 
    return $array1; 
} 

你可以簡單地使用它,你做同樣的方式之前:

$added = array_diff_once($new,$old); 
$removed = array_diff_once($old,$new); 

這些陣列的print_r()可以正確輸出:

Array 
(
    [2] => 1 
) 
Array 
(
    [2] => 10 
) 

Working demo

+0

@Downvoter:你的解釋可以幫助我提高這個回答。 –

+0

你不需要編寫自己的函數。 PHP有一個內置的函數來檢查數組的鍵值。 – VMai

+1

@VMai:OP沒有對數組鍵進行任何說明。 '$ old = array(2,1); $ new = array(1,2);'應該產生一個空數組,但是'print_r(array_diff_assoc($ new,$ old));'給出'[1,2]'。請注意,OP沒有對數組鍵進行任何說明。 –

-2

如果除了價值之外,您還想檢查關鍵字數組的ES,你應該使用array_diff_assoc(),而不是array_diff()

<?php 
    $old = array(1,5,10); 
    $new = array(1,5,1); 

    $added = array_diff_assoc($new,$old); 
    $removed = array_diff_assoc($old,$new); 

    echo "<pre>\n";  \\ prints array(1) { [2]=> int(1) } 
    var_dump($added); 
    var_dump($removed); 
    echo "</pre>\n"; 

>

+0

@downvoter:請解釋我的答案有什麼問題。我認爲這是一個明確的答案,解釋了OPs代碼的差異。 – VMai

+1

這也考慮了陣列中元素在計算差異時的位置。例如,OP的數組重新排列:'$ old = array(1,5,10); $ new = array(5,1,1);'會產生[5,1,1]'。這是不正確的。 –

相關問題