
Jonathan Chan
Ich habe ein Array mit Zeilen assoziativer Daten.
$array1 = array(
array('ITEM' => 1),
array('ITEM' => 2),
array('ITEM' => 3),
);
Ich habe ein zweites Array, das ebenfalls Zeilen mit assoziativen Daten enthält, die ich mit dem ersten Array filtern möchte.
$array2 = array(
array('ITEM' => 2),
array('ITEM' => 3),
array('ITEM' => 1),
array('ITEM' => 4),
);
Das fühlt sich an wie ein Job für array_diff()
aber wie kann ich die Zeilen ausschließlich auf der Tiefe vergleichen ITEM
Werte?
Wie kann ich das zweite Array filtern und das folgende Ergebnis erhalten?
array(3 => array('ITEM' => 4))
Mit können Sie eine benutzerdefinierte Vergleichsfunktion definieren array_udiff()
.
function udiffCompare($a, $b)
{
return $a['ITEM'] - $b['ITEM'];
}
$arrdiff = array_udiff($arr2, $arr1, 'udiffCompare');
print_r($arrdiff);
Ausgabe:
Array
(
[3] => Array
(
[ITEM] => 4
)
)
Dadurch wird die vorhandene Struktur der Arrays verwendet und beibehalten, was Sie meiner Meinung nach wünschen.

Jason Fingar
Ich würde wahrscheinlich die ursprünglichen Arrays durchlaufen und sie eindimensional machen … so etwas wie
foreach($array1 as $aV){
$aTmp1[] = $aV['ITEM'];
}
foreach($array2 as $aV){
$aTmp2[] = $aV['ITEM'];
}
$new_array = array_diff($aTmp1,$aTmp2);
Ein weiterer lustiger Ansatz mit a json_encode
Trick (kann nützlich sein, wenn Sie einige komplexe Werte im Array der ersten Ebene “roh” vergleichen müssen):
// 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);

Markus Amery
Ein paar Lösungen mit array_filter
die weniger leistungsfähig sind als die array_udiff
Lösung für große Arrays, die aber etwas einfacher und flexibler sind:
$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;
});
Wie immer mit array_filter
beachten Sie, dass array_filter
behält die Schlüssel des ursprünglichen Arrays bei, also wenn Sie wollen $arrayDiff
null-indiziert sein, tun $arrayDiff = array_values($arrayDiff);
nach dem array_filter
Anruf.
Sie können den folgenden Code verwenden, um den Unterschied zu erhalten
$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'));

AFwcxx
Ich habe das gleiche Problem, aber mein mehrdimensionales Array hat verschiedene Schlüssel im Gegensatz zu Ihrem “ITEM” konsistent in jedem Array.
Gelöst mit: $result = array_diff_assoc($array2, $array1);
Referenz: PHP: array_diff_assoc

Jamel Zarga
Eine andere Lösung if( json_encode($array1) == json_encode($array2) ){ … }
9871200cookie-checkVergleichen Sie zweidimensionale Datensätze basierend auf einem angegebenen Wert der zweiten Ebeneyes