Obtenga la diferencia entre dos matrices bidimensionales (cada una de las cuales contiene una sola columna de valores)

Resuelto Jonathan Chan asked hace 54 años • 9 respuestas

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 ITEMvalores más profundos?

¿Cómo puedo filtrar la segunda matriz y obtener el siguiente resultado?

array(3 => array('ITEM' => 4))
Jonathan Chan avatar Jan 01 '70 08:01 Jonathan Chan
Aceptado

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.

Wiseguy avatar Aug 06 '2012 03:08 Wiseguy

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);
Jason Fingar avatar Aug 06 '2012 02:08 Jason Fingar

Otro enfoque divertido con un json_encodetruco (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);
Ifnot avatar Mar 01 '2017 11:03 Ifnot