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>
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>
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>
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!