Heim  >  Artikel  >  Backend-Entwicklung  >  Wie filtere ich überlappende Zeilen in 2D-Arrays mit der PHP-Funktion „array_diff_assoc()“?

Wie filtere ich überlappende Zeilen in 2D-Arrays mit der PHP-Funktion „array_diff_assoc()“?

Linda Hamilton
Linda HamiltonOriginal
2024-10-25 11:17:30113Durchsuche

How to Filter Overlapping Rows in 2D Arrays Using PHP's `array_diff_assoc()` Function?

Zeilen eines 2D-Arrays basierend auf überlappenden Zeilen filtern

In PHP wird die Funktion array_diff_assoc() häufig verwendet, um den Unterschied zwischen zu bestimmen zwei Arrays. In bestimmten Szenarien mit 2D-Arrays können Benutzer jedoch auf unerwartete Ergebnisse stoßen, wenn sie versuchen, überlappende Zeilen herauszufiltern.

Ein Benutzer berichtete, dass er array_diff_assoc() verwendet habe, um zwei 2D-Arrays zu vergleichen, bemerkte jedoch, dass das Ergebnis gemeinsame Zeilen von beiden enthielt Arrays anstelle nur der eindeutigen Zeilen. Um das Problem zu verstehen, untersuchen wir die vom Benutzer bereitgestellten Beispieldaten:

$array1 = [
    [12 => 'new q sets'],
    [11 => 'common set']
];

$array2 => [
    [11 => 'common set']
];

Nach dem Aufruf von array_diff_assoc($array1, $array2) erwartete der Benutzer, eine Ausgabe zu erhalten, die nur die eindeutige Zeile von $array1 enthält (d. h. '[12 => 'neue q-Sets']'). Die eigentliche Ausgabe war jedoch:

[
    [11 => 'common set']
]

Das Problem liegt in der Art und Weise, wie PHP Werte in array_diff_assoc() vergleicht. Zwei Werte gelten nur dann als gleich, wenn sie als Zeichenfolgen strikt gleich sind. Im Fall der bereitgestellten 2D-Arrays ist der mit dem Schlüssel „11“ in beiden Arrays verknüpfte Wert die Zeichenfolge „Common Set“. Die Schlüssel-Wert-Paare selbst sind jedoch nicht identisch mit Arrays.

Wenn array_diff_assoc() die beiden Arrays vergleicht, stellt es fest, dass das Schlüssel-Wert-Paar [11 => 'common set'] ist beiden Arrays gemeinsam und schließt es von der Differenz aus. Dieses Verhalten ist auf die Tatsache zurückzuführen, dass alle Arrays in PHP intern als Zeichenfolge „Array“ dargestellt werden.

Um dieses Problem zu beheben, kann man einen anderen Ansatz verwenden, um überlappende Zeilen zwischen 2D-Arrays herauszufiltern. Eine gängige Methode besteht darin, für jede Zeile einen eindeutigen Bezeichner zu erstellen und diesen Bezeichner als Schlüssel für ein assoziatives Array zu verwenden. Hier ist ein Beispiel:

$uniqueIdentifiers = [];
$filteredRows = [];

foreach ($array1 as $row) {
    $uniqueIdentifier = implode('|', array_values($row));
    $uniqueIdentifiers[$uniqueIdentifier] = true;
}

foreach ($array2 as $row) {
    $uniqueIdentifier = implode('|', array_values($row));
    if (isset($uniqueIdentifiers[$uniqueIdentifier])) {
        unset($uniqueIdentifiers[$uniqueIdentifier]);
    }
}

foreach ($uniqueIdentifiers as $uniqueIdentifier => $isPresent) {
    $filteredRows[] = array_values(array_flip(explode('|', $uniqueIdentifier)));
}

Dieser Ansatz erstellt eine eindeutige Kennung für jede Zeile, indem die Array-Werte verkettet und als Schlüssel verwendet werden. Anschließend wird das zweite Array durchlaufen und alle übereinstimmenden eindeutigen Bezeichner aus der Liste gelöscht. Schließlich durchläuft es die verbleibenden eindeutigen Bezeichner, dreht die Schlüssel und Werte um, um die Zeilen zu rekonstruieren, und fügt sie dem $filteredRows-Array hinzu.

Mit dieser Methode können Sie überlappende Zeilen zwischen 2D-Arrays effektiv herausfiltern Dabei wird sichergestellt, dass eindeutige Zeilen korrekt identifiziert und im Ergebnis zurückgegeben werden.

Das obige ist der detaillierte Inhalt vonWie filtere ich überlappende Zeilen in 2D-Arrays mit der PHP-Funktion „array_diff_assoc()“?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn