diferencia entre dos matrices

Resuelto user1178695 asked hace 54 años • 7 respuestas

Tengo las siguientes dos matrices. Quiero la diferencia entre estas dos matrices. Es decir, ¿cómo puedo encontrar los valores que no existen en ambos arrays?

 $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);
user1178695 avatar Jan 01 '70 08:01 user1178695
Aceptado

Para obtener la diferencia entre las dos matrices, debe hacer lo siguiente:

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

La razón es que array_diff()solo le dará los valores que están $array1pero no $array2, no al revés. Lo anterior le dará ambos.

Crashspeeder avatar Apr 09 '2012 18:04 Crashspeeder

Nota: esta respuesta devolverá los valores $array2que no están presentes en $array1, no devolverá los valores $array1que no están en $array2.

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

array_diff()

KingCrunch avatar Apr 09 '2012 18:04 KingCrunch

Si desea obtener las diferencias entre matrices de forma recursiva, pruebe esta función:

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;
}

Prueba:

$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);

Producción:

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
                )

        )

)
M Rostami avatar Nov 30 '2015 07:11 M Rostami