Vergleichen Sie zweidimensionale Datensätze basierend auf einem angegebenen Wert der zweiten Ebene

Lesezeit: 3 Minuten

Vergleichen Sie zweidimensionale Datensatze basierend auf einem angegebenen Wert der
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.

  • Ich weiß, dass dies ein etwas altes Thema ist, aber für andere, die IDs verwenden, die keine Ganzzahlen, sondern Zeichenfolgen sind, möchten Sie vielleicht return strcmp($a[‘ITEM],$b[‘ITEM’]) in der udiffCompare-Funktion

    – despina

    28. März 2014 um 14:14 Uhr

  • In PHP7 und höher können Sie die Raumschiffbetreiber: return $a['ITEM'] <=> $b['ITEM'];

    – Bischof

    8. Juni 2015 um 17:38 Uhr

  • Eine Sache, die ich gerne gewusst hätte, bevor ich versucht habe, diese Funktion zu verwenden, ist, dass die array_udiff Funktionsargumente $arr2 und $arr1 korrelieren NICHT mit den Funktionsargumenten $a und $b von udiffCompare. Ich kratzte mich immer wieder am Kopf und fragte mich, warum Elemente von $arr2 innerhalb des Rückrufs mit sich selbst verglichen wurden. Ich habe das mit diesem Kommentar in der PHP-Dokumentation herausgefunden: php.net/manual/en/function.array-udiff.php#80149

    – Keven

    15. März 2018 um 21:44 Uhr

1646901247 310 Vergleichen Sie zweidimensionale Datensatze basierend auf einem angegebenen Wert der
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);

  • Danke, nur das funktioniert. symmetrische Ausführung public static function myArrayDiff($array1, $array2) { return array_map('json_decode', array_merge( array_diff(array_map('json_encode', $array1), array_map('json_encode', $array2)), array_diff(array_map('json_encode', $array2), array_map('json_encode', $array1)) )); }

    – Dimmduh

    7. März 2017 um 11:00 Uhr


Vergleichen Sie zweidimensionale Datensatze basierend auf einem angegebenen Wert der
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_filterbeachten 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'));

1646901248 690 Vergleichen Sie zweidimensionale Datensatze basierend auf einem angegebenen Wert der
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

1646901249 774 Vergleichen Sie zweidimensionale Datensatze basierend auf einem angegebenen Wert der
Jamel Zarga

Eine andere Lösung if( json_encode($array1) == json_encode($array2) ){ … }

987120cookie-checkVergleichen Sie zweidimensionale Datensätze basierend auf einem angegebenen Wert der zweiten Ebene

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy