Obtenga la diferencia entre dos matrices bidimensionales (cada una de las cuales contiene una sola columna de valores)
Tengo una matriz que contiene filas de datos asociativos.
$array1 = array(
array('ITEM' => 1),
array('ITEM' => 2),
array('ITEM' => 3),
);
Tengo una segunda matriz, que también contiene filas de datos asociativos, que me gustaría filtrar usando la primera matriz.
$array2 = array(
array('ITEM' => 2),
array('ITEM' => 3),
array('ITEM' => 1),
array('ITEM' => 4),
);
Esto parece un trabajo para array_diff()
, pero ¿cómo puedo comparar las filas exclusivamente en los ITEM
valores más profundos?
¿Cómo puedo filtrar la segunda matriz y obtener el siguiente resultado?
array(3 => array('ITEM' => 4))
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);
Producción:
Array
(
[3] => Array
(
[ITEM] => 4
)
)
Esto utiliza y preserva la estructura existente de las matrices, lo cual supongo que desea.
Probablemente iteraría a través de las matrices originales y las haría unidimensionales... algo así como
foreach($array1 as $aV){
$aTmp1[] = $aV['ITEM'];
}
foreach($array2 as $aV){
$aTmp2[] = $aV['ITEM'];
}
$new_array = array_diff($aTmp1,$aTmp2);
Otro enfoque divertido con un json_encode
truco (puede ser útil si necesita comparar "sin procesar" algunos valores complejos en la matriz de 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);