Wie suche ich in PHP rekursiv nach einem Schlüssel in einem mehrdimensionalen Array?

Mary-Kate Olsen
Freigeben: 2024-11-02 15:58:30
Original
806 Leute haben es durchsucht

How to Recursively Search for a Key in a Multidimensional Array in PHP?

Rekursive Suche nach einem Schlüssel in einem mehrdimensionalen Array

Problem:

Die bereitgestellte find()-Methode versucht, rekursiv zu suchen Suchen Sie nach einem bestimmten Schlüssel in einem assoziativen Array und geben Sie den zugehörigen Wert zurück. Allerdings gibt es bei der Rekursionsimplementierung ein Problem.

Lösung:

Das Problem mit dem Originalcode hängt mit der Rekursion zusammen. Es wird versucht, die Ausgabe des rekursiven Aufrufs direkt zurückzugeben, ohne den Fall zu behandeln, in dem auf der aktuellen Ebene keine Übereinstimmung gefunden wird. Dies kann zum falschen Rückgabewert „nicht gefunden“ führen, unabhängig davon, ob eine Übereinstimmung tiefer im Array vorhanden ist.

Um dies zu beheben, kann der folgende Code verwendet werden, um die Rekursion korrekt zu verarbeiten:

<code class="php">private function find($needle, $haystack) {
    foreach ($haystack as $name => $file) {
        if ($needle == $name) {
            return $file;
        } else if(is_array($file)) { //is folder
            $result = $this->find($needle, $file); //file is the new haystack
            if ($result !== "did not find") {
                return $result;
            }
        }               
    }
    
    return "did not find";
}</code>
Nach dem Login kopieren

Diese aktualisierte Funktion prüft, ob das Ergebnis des rekursiven Aufrufs nicht „nicht gefunden“ lautet, was darauf hinweist, dass eine Übereinstimmung auf einer tieferen Ebene gefunden wurde. In diesem Fall wird der gefundene Wert zurückgegeben. Andernfalls wird wie zuvor der Wert „nicht gefunden“ zurückgegeben.

Alternative Lösungen:

In modernen PHP-Versionen (5.6 und höher) werden alternative Lösungen verwendet, die Iteratoren und verwenden /oder Generatoren können effizienter und eleganter sein:

<code class="php">function recursiveFind(array $haystack, $needle)
{
    $iterator  = new RecursiveArrayIterator($haystack);
    $recursive = new RecursiveIteratorIterator(
        $iterator,
        RecursiveIteratorIterator::SELF_FIRST
    );
    foreach ($recursive as $key => $value) {
        if ($key === $needle) {
            return $value;
        }
    }
}</code>
Nach dem Login kopieren

Diese Funktion verwendet Iteratoren, um das mehrdimensionale Array effizient zu durchlaufen und den ersten passenden Schlüssel zu finden.

Zusätzlich können Generatoren zum Iterieren verwendet werden über alle passenden Elemente, nicht nur das erste:

<code class="php">function recursiveFind(array $haystack, $needle)
{
    $iterator  = new RecursiveArrayIterator($haystack);
    $recursive = new RecursiveIteratorIterator(
        $iterator,
        RecursiveIteratorIterator::SELF_FIRST
    );
    foreach ($recursive as $key => $value) {
        if ($key === $needle) {
            yield $value;
        }
    }
}

// Usage
foreach (recursiveFind($haystack, $needle) as $value) {
    // Use `$value` here
}</code>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie suche ich in PHP rekursiv nach einem Schlüssel in einem mehrdimensionalen Array?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!