diferencia entre dos matrices
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);
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 $array1
pero no $array2
, no al revés. Lo anterior le dará ambos.
Nota: esta respuesta devolverá los valores $array2
que no están presentes en $array1
, no devolverá los valores $array1
que no están en $array2
.
$diff = array_diff($array2, $array1);
array_diff()
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
)
)
)