PHP: Einen mehrdimensionalen Array durchsuchen

Heute möchte ich dir kleine, aber nützliche PHP-Funktionen vorstellen, mit denen du mehrdimensionale Arrays durchsuchen und gewünschten Sub-Array zurückgeben kannst. Im ersten Schritt erfährst du, wie du einfache mehrdimensionale Arrays durchsuchst und anschließend, wie du verschachtelte Arrays durchsuchst.

function search_array($array, $key, $value, $default = false)
{
    return array_column($array, null, $key)[$value] ?? $default;
}Code-Sprache: PHP (php)

Parameter:

  1. $array: Das mehrdimensionale Array, das du durchsuchen möchtest.
  2. $key: Der Schlüssel, nach dem du suchen möchtest.
  3. $value: Der Wert, den der Schlüssel haben sollte.
  4. $default: Ein optionaler Parameter, der den Wert definiert, der zurückgegeben wird, falls der gesuchte Wert nicht gefunden wird. Standardmäßig ist dieser Wert false

Funktionsweise:

Die Funktion verwendet array_column, um ein Array von Werten aus dem Input-Array zu extrahieren, die einem bestimmten Schlüssel zugeordnet sind. Anschließend wird versucht, den gewünschten Wert im extrahierten Array mit dem angegebenen Schlüsselwert zu finden. Wenn der Wert gefunden wird, wird der zugehörige Sub-Array zurückgegeben. Wenn der Wert nicht gefunden wird, wird der Standardwert zurückgegeben.

Ein praktisches Beispiel:

Stell dir vor, du hast folgendes mehrdimensionales Array:

$personen = [
    ['id' => 1, 'name' => 'Anton', 'alter' => 25],
    ['id' => 2, 'name' => 'Berta', 'alter' => 30],
    ['id' => 3, 'name' => 'Cäsar', 'alter' => 35],
];Code-Sprache: PHP (php)

Und du möchtest das Sub-Array des Benutzers mit der ID 2 erhalten. Du könntest die search_array Funktion wie folgt verwenden:

$person = search_array($personen, 'id', 2);
print_r($person);Code-Sprache: PHP (php)

Das Ergebnis wäre:

Array
(
    [id] => 2
    [name] => Berta
    [alter] => 30
)Code-Sprache: PHP (php)

Wenn der gesuchte Wert nicht existiert, zum Beispiel ID 4, wird false oder ein anderer Standardwert, den du definierst, zurückgegeben.

Wenn die Funktion auch stark verschachtelte, mehrdimensionale Arrays durchsuchen soll, wäre eine rekursive Vorgehensweise angebracht. Hier ist eine modifizierte Version der Funktion, die rekursiv in den verschachtelten Arrays sucht, um den gewünschten Wert zu finden:

function search_nested_array($array, $key, $value, $default = false) {
    foreach ($array as $subArray) {
        if (isset($subArray[$key]) && $subArray[$key] == $value) {
            return $subArray;
        } elseif (is_array($subArray)) {
            $result = search_nested_array($subArray, $key, $value, $default);
            if ($result !== $default) {
                return $result;
            }
        }
    }

    return $default;
}Code-Sprache: PHP (php)

Wie funktioniert die angepasste Funktion?

Diese angepasste Funktion verwendet Rekursion, um in jedem Sub-Array nach dem gewünschten Schlüssel und Wert zu suchen. Wenn ein Sub-Array den gesuchten Wert enthält, wird es zurückgegeben. Wenn der Wert nicht gefunden wird, wird die Funktion rekursiv aufgerufen, um die nächste Ebene von Sub-Arrays zu durchsuchen. Dieser Prozess wird fortgesetzt, bis der Wert gefunden oder das gesamte Array durchsucht wurde. Wenn der Wert nicht gefunden wird, gibt die Funktion einen Standardwert zurück.

Ein Beispiel zur Verwendung:

Angenommen, du hast ein stark verschachteltes Array, wie dieses hier:

$personen = [
    ['id' => 1, 'name' => 'Anton', 'info' => ['alter' => 25, 'stadt' => 'Berlin']],
    ['id' => 2, 'name' => 'Berta', 'info' => ['alter' => 30, 'stadt' => 'München']],
    ['id' => 3, 'name' => 'Cäsar', 'info' => ['alter' => 35, 'stadt' => 'Hamburg']],
];Code-Sprache: PHP (php)

Wenn du nun das Sub-Array des Benutzers mit der Stadt „München“ erhalten möchtest, kannst du die search_nested_array Funktion wie folgt verwenden:

$person = <code>search_nested_array</code>($personen, 'stadt', 'München');
print_r($user);
Code-Sprache: PHP (php)

Dies wird den Sub-Array von Berta zurückgeben, obwohl der Schlüssel stadt in einem verschachtelten Array innerhalb des Hauptarrays liegt.