2012-10-29 82 views
4

我有兩個數組要比較兩個陣列,同時考慮重複值

$array1 = array(1, 2, 2, 3); 
$array2 = array(1, 2, 3,4); 

,做的時候:

var_dump(array_diff($array1, $array2)); 

越來越:

array(0){} 

的輸出,但我期待的:

array(1){[2]=>2} 

有人可以請讓我知道如何做到這一點提前

+1

你爲什麼期待'array(2)'?在兩個數組中都找到了'2',因此不會在差異中找到。而已。 –

+0

'arary_diff'返回一個數組,其中包含來自'array1'的所有條目,其**不存在於任何其他數組中。 – Kermit

+0

是的,array_diff返回一個數組,其中包含array1中不存在於任何其他數組中的所有條目,但是我也需要檢查重複值,並且array_diff沒有滿足這個要求,所以尋找替代方案 – user522170

回答

3

試試這個

$array1 = array(1, 2, 2, 3, 4, 5, 5, 7); 
$array2 = array(1, 2, 4, 6, 3, 3, 5); 
$diff = array_filter($array1, 
    function ($val) use (&$array2) { 
    $key = array_search($val, $array2); 
    if ($key === false) return true; 
    unset($array2[$key]); 
    return false; 
    } 
); 
print_r($diff); 
// Array ([2] => 2 [6] => 5 [7] => 7) 
-1

謝謝雖然它可能不那麼優雅,簡單的方法做,這是一個for循環:

$diff_array = array(); 
for ($i = 0; ($i < count($array1)) and ($i < count($array2)); $i++) 
{ 
    if ($array1[$i] !== $array2[$i]) { $diff_array[$i] = $array1[$i]; } 
} 
+0

如果數組不同大小?這段代碼會返回'3'。 OP正在尋找重複值,而不是每個數組之間的差異。 – Kermit

+0

這種方法的優點是你可以控制你的工作。如果數組的大小不同,則可以執行以下操作:例如: ($ i Ynhockey

1

這將讓你期望的結果:

$array1 = array(1, 2, 2, 3); 
$array2 = array(1, 2, 3,4); 

$countArray1 = array_count_values($array1); 
$countArray2 = array_count_values($array2); 

foreach($countArray1 as $value=>$count) { 
    if($count > 1) $dupArray[] = $value; 
} 

foreach($countArray2 as $value=>$count) { 
    if($count > 1) $dupArray[] = $value; 
} 

print_r($dupArray); 

結果

Array 
(
    [0] => 2 
)

說明

使用array_count_values會計算一個數組中所有的值,這將是這樣的:

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

Array 
(
    [1] => 1 
    [2] => 1 
    [3] => 1 
    [4] => 1 
)

然後,我們通過每個array_count_values迭代來定位出現多於值一旦。這將工作當你有一組以上的重複值的:如果你想從計算重複的元素的數量

$array1 = array(1, 2, 2, 3); 
$array2 = array(1, 2, 3, 4, 3); 

結果

Array 
(
    [0] => 2 
    [1] => 3 
)
3

相同陣列以及多個陣列,請使用下面的代碼,

<?php 
    $array1 = array(1,2,2,3,7); 
    $array2 = array(1,2,3,4); 
    $diff_array = array(); 

    $diff_array1 = array_count_values($array1); 
    $diff_array2 = array_count_values($array2); 

    $a = array_keys($diff_array1); 
    $b = array_keys($diff_array2); 

    for($i=0;$i<count($a);$i++) 
    { 
     if($a[$i] == $b[$i]) 
     { 
      $x = $a[$i]; 
      $y = $b[$i]; 
      $diff_array1[$x] += $diff_array2[$y]; 
     } 
    } 
    $diff_array1=array_diff($diff_array1, array('1')); 
    echo '<pre>'; 
    print_r($diff_array1); 
?>