两个数组之间的差异

52

我有以下两个数组。我想要这两个数组之间的差异。也就是说,如何找到在这两个数组中都不存在的值?

 $array1=Array ( [0] => 64 [1] => 98 [2] => 112 [3] => 92 [4] => 92 [5] => 92 ) ;
 $array2=Array ( [0] => 3 [1] => 26 [2] => 38 [3] => 40 [4] => 44 [5] => 46 [6] => 48 [7] => 52 [8] => 64 [9] => 68 [10] => 70 [11] => 72 [12] => 102 [13] => 104 [14] => 106 [15] => 92 [16] => 94 [17] => 96 [18] => 98 [19] => 100 [20] => 108 [21] => 110 [22] => 112);
7个回答

203

要获取两个数组之间的差异,您需要执行以下操作:

$fullDiff = array_merge(array_diff($array1, $array2), array_diff($array2, $array1));

之所以如此,是因为array_diff()只会给出在$array1中但不在$array2中的值,而不是相反。上面这个代码将会给出两个数组中不同的值。


6
如果需要保留键名:$full_diff = array_diff($array1, $array2) + array_diff($array2, $array1); - dtbarne

46

注意:此答案将返回$array2中不包含在$array1中的值,而不会返回$array1中不在$array2中的值。

$diff = array_diff($array2, $array1);

array_diff()


19
看起来这是不正确的 - 它不会返回 $array1 中不存在的值在 $array2 中的值。Crasherspeeder 似乎是正确的。 - Shog9
10
@Crasherspeeder说得对,这是一个单向检查——提问者希望两个方向都得到回答。 - scrowler
array_diff_*系列对于多维数组也会抛出“ErrorException: Array to string conversion”的异常。 - eithed

9
如果您想递归地获取数组之间的差异,请尝试使用以下函数:
function arrayDiffRecursive(array $firstArray,array  $secondArray, bool $reverse = false): array 
{
    $first = 'first';
    $second = 'second';
    if ($reverse) {
        $first = 'second';
        $second = 'first';
    }
    $diff = [];
    foreach ($firstArray as $k => $value) {
        if (!is_array($value)) {
            if (!array_key_exists($k, $secondArray) || $secondArray[$k] != $value) {
                $diff[$first][$k] = $value;
                $diff[$second][$k] = $secondArray[$k] ?? null;
            }
            continue;
        }
        if (!array_key_exists($k, $secondArray) || !is_array($secondArray[$k])) {
            $diff[$first][$k] = $value;
            $diff[$second][$k] = $secondArray[$k] ?? null;
            continue;
        }
        $newDiff = arrayDiffRecursive($value, $secondArray[$k], $reverse);
        if (!empty($newDiff)) {
            $diff[$first][$k] = $newDiff[$first];
            $diff[$second][$k] = $newDiff[$second];
        }
    }
    return $diff;
}

测试:

$firstArray = ['a' => ['b' => 'c'], 'g' => ['h' => 's']];
$secondArray = ['b' => 'c', 'd' => ['e' => 'f'], 'g' => ['i' => 'j']];
$diffs = array_replace_recursive(
    arrayDiffRecursive($firstArray, $secondArray),
    arrayDiffRecursive($secondArray, $firstArray, true)
);
print_r($diffs);

输出:

Array
(
    [first] => Array
        (
            [a] => Array
                (
                    [b] => c
                )

            [g] => Array
                (
                    [h] => s
                    [i] =>
                )

            [b] =>
            [d] =>
        )

    [second] => Array
        (
            [a] =>
            [g] => Array
                (
                    [h] =>
                    [i] => j
                )

            [b] => c
            [d] => Array
                (
                    [e] => f
                )

        )

)

2
最佳 PHP 递归数组差异算法。 - xfscrypt
了不起的工作!这就是每个人都在寻找的。 - pbarney

2
<?php
function getArrayDiff($a1, $a2) {
    $result = array();

    print_r($a1);
    print_r($a2);

    // If First Array is Bigger than Second
    if( count($a1) > count($a2) ) {
        $result=array_diff($a1,$a2);
    }
    // If Second Array is Bigger than First
    if( count($a1) < count($a2) ) {
        $result=array_diff($a2,$a1);
    }
    // If Both array are same but, data values are different.
    else
    {
        $result = array_merge (array_diff($a2,$a1), array_diff($a1,$a2));   
    }
    return $result;
}

print "<pre>";
// First Array is Big
echo "First Array is Big <br/>";
$a1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow");
$a2=array("e"=>"red","f"=>"green","g"=>"blue");
print_r( getArrayDiff($a1, $a2) );

// Second Array is Big
echo "Second Array is Big <br/>";
$a1=array("e"=>"red","f"=>"green","g"=>"blue");
$a2=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow");
print_r( getArrayDiff($a1, $a2) );

// Both Array are same
echo "Both Array are same <br/>";
$a1=array("a"=>"red","b"=>"green","d"=>"yellow");
$a2=array("e"=>"red","f"=>"green","g"=>"blue");
print_r( getArrayDiff($a1, $a2) );

?>

输出:

First Array is Big 
Array
(
    [a] => red
    [b] => green
    [c] => blue
    [d] => yellow
)
Array
(
    [e] => red
    [f] => green
    [g] => blue
)
Array
(
    [d] => yellow
)
Second Array is Big 
Array
(
    [e] => red
    [f] => green
    [g] => blue
)
Array
(
    [a] => red
    [b] => green
    [c] => blue
    [d] => yellow
)
Array
(
    [d] => yellow
)
Both Array are same 
Array
(
    [a] => red
    [b] => green
    [d] => yellow
)
Array
(
    [e] => red
    [f] => green
    [g] => blue
)
Array
(
    [g] => blue
    [d] => yellow
)

2

如果你要使用array_diff()函数。


需要注意的是参数的书写顺序。

PHP文档:array_diff

# array_diff(1, 2)
array_diff($one, $two);

# array_diff(2, 1)
array_diff($two, $one); // produces different result.

1

0
$numbers = range(000000, 999999);
$numbers = array_map(function ($n) {
    if (strlen($n) < 6) {
        $addZero = 6 - strlen($n);
        $appendZero = str_repeat('0', $addZero);
        $n = $appendZero . $n;
    }
    return $n;
}, $numbers);
$allRanges = array_diff($numbers, $getAllPurchasedTicketsArr);

1
感谢您提供的代码片段,它可能会提供一些有限的即时帮助。适当的解释将大大提高其长期价值,因为它可以展示为什么这是一个好的解决方案,并使它对未来遇到类似问题的读者更有用。请编辑您的答案以添加一些解释,包括您所做出的假设。 - jasie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接