net multidimensionales multidimensional filtrar diferencia comparar arreglos array_intersect_assoc array_diff array php arrays

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