filtrar - php comparar arrays multidimensionales
array_diff() con matrices multidimensionales (6)
Otro enfoque divertido con un truco json_encode
(puede ser útil si necesita comparar algunos valores complejos en el primer nivel)
// Compare all values by a json_encode
$diff = array_diff(array_map(''json_encode'', $array1), array_map(''json_encode'', $array2));
// Json decode the result
$diff = array_map(''json_decode'', $diff);
Usando array_diff()
, puedo comparar y eliminar elementos similares, pero ¿qué array_diff()
si tengo las siguientes matrices?
Array1
Array
(
[0] => Array
(
[ITEM] => 1
)
[1] => Array
(
[ITEM] => 2
)
[2] => Array
(
[ITEM] => 3
)
)
Array2
Array
(
[0] => Array
(
[ITEM] => 2
)
[1] => Array
(
[ITEM] => 3
)
[2] => Array
(
[ITEM] => 1
)
[3] => Array
(
[ITEM] => 4
)
)
Quiero filtrar los elementos similares; el resultado debe regresar 4. ¿Cómo puedo reorganizar mi matriz para poder usar array_diff()
?
Probablemente iteraría a través de las matrices originales y las haría de 1 dimensión ... algo así como
foreach($array1 as $aV){
$aTmp1[] = $aV[''ITEM''];
}
foreach($array2 as $aV){
$aTmp2[] = $aV[''ITEM''];
}
$new_array = array_diff($aTmp1,$aTmp2);
Puede definir una función de comparación personalizada utilizando array_udiff()
.
function udiffCompare($a, $b)
{
return $a[''ITEM''] - $b[''ITEM''];
}
$arrdiff = array_udiff($arr2, $arr1, ''udiffCompare'');
print_r($arrdiff);
Salida:
Array
(
[3] => Array
(
[ITEM] => 4
)
)
Esto usa y preserva la estructura existente de las matrices, que supongo que quieres.
Tengo el mismo problema, pero mi matriz multidimensional tiene varias teclas a diferencia de su "ITEM" consistentemente en cada matriz.
Resuelto con: $result = array_diff_assoc($array2, $array1);
Referencia: PHP: array_diff_assoc
Un par de soluciones que usan array_filter
son menos array_filter
que la solución array_udiff
para matrices grandes, pero que son un poco más sencillas y flexibles:
$array1 = [
[''ITEM'' => 1],
[''ITEM'' => 2],
[''ITEM'' => 3],
];
$array2 = [
[''ITEM'' => 2],
[''ITEM'' => 3],
[''ITEM'' => 1],
[''ITEM'' => 4],
];
$arrayDiff = array_filter($array2, function ($element) use ($array1) {
return !in_array($element, $array1);
});
// OR
$arrayDiff = array_filter($array2, function ($array2Element) use ($array1) {
foreach ($array1 as $array1Element) {
if ($array1Element[''ITEM''] == $array2Element[''ITEM'']) {
return false;
}
}
return true;
});
Como siempre con array_filter
, tenga en cuenta que array_filter
conserva las claves de la matriz original, por lo que si desea que $arrayDiff
no $arrayDiff = array_values($arrayDiff);
, haga $arrayDiff = array_values($arrayDiff);
después de la llamada a array_filter
.
puedes usar el código a continuación para obtener la diferencia
$a1 = Array(
[0] => Array(
[ITEM] => 1
)
[1] => Array(
[ITEM] => 2
)
[2] => Array(
[ITEM] => 3
)
);
$a2 = Array(
[0] => Array(
[ITEM] => 2
)
[1] => Array(
[ITEM] => 3
)
[2] => Array(
[ITEM] => 1
)
[3] => Array(
[ITEM] => 4
));
array_diff(array_column($a1, ''ITEM''), array_column($a2, ''ITEM''));