Problème :
La méthode find() fournie tente de récursivement rechercher une clé spécifique dans un tableau associatif et renvoyer la valeur associée. Cependant, l'implémentation de la récursivité a un problème.
Solution :
Le problème avec le code d'origine est lié à la récursivité. Il tente de renvoyer directement la sortie de l'appel récursif sans gérer le cas où aucune correspondance n'est trouvée au niveau actuel. Cela peut conduire à la valeur de retour incorrecte de « n'a pas trouvé », qu'une correspondance existe ou non plus profondément dans le tableau.
Pour remédier à cela, le code suivant peut être utilisé pour gérer correctement la récursivité :
<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>
Cette fonction mise à jour vérifie si le résultat de l'appel récursif n'est pas "n'a pas trouvé", indiquant qu'une correspondance a été trouvée à un niveau plus profond. Dans ce cas, il renvoie la valeur trouvée. Sinon, il renvoie la valeur "n'a pas trouvé" comme avant.
Solutions alternatives :
Dans les versions PHP modernes (5.6 et supérieures), des solutions alternatives utilisant des itérateurs et /ou les générateurs peuvent être plus efficaces et élégants :
<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>
Cette fonction utilise des itérateurs pour parcourir efficacement le tableau multidimensionnel et trouver la première clé correspondante.
De plus, des générateurs peuvent être utilisés pour itérer sur tous les éléments correspondants, pas seulement le premier :
<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>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!