Récupération de la valeur de la première clé correspondante dans un tableau multidimensionnel : résoudre les problèmes de récursion
Dans le développement de logiciels, naviguer dans des tableaux multidimensionnels et rechercher des clés spécifiques sont une tâche courante. Cependant, lorsque la récursion est impliquée, les choses peuvent devenir délicates. Analysons l'extrait de code suivant qui vise à trouver la valeur associée à une clé correspondante :
<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 return $this->find($needle, $file); //file is the new haystack } } return "did not find"; }</code>
Le problème réside dans la récursivité elle-même. Lorsqu'elle rencontre un tableau dans la botte de foin, la variable fichier devient la nouvelle botte de foin. Cependant, la référence à la botte de foin d'origine est perdue, conduisant potentiellement à un cycle de récursion éternel.
Pour résoudre ce problème, envisagez les solutions suivantes :
RecursiveIteratorIterator
PHP 5.6 et versions ultérieures introduisent RecursiveIteratorIterator, ce qui simplifie considérablement la tâche :
<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 approche tire parti d'un RecursiveArrayIterator qui traverse le tableau et d'un RecursiveIteratorIterator qui parcourt efficacement tous les éléments, y compris les tableaux imbriqués.
Fonction basée sur un générateur
Pour PHP 5.6 et versions ultérieures, vous pouvez utiliser des générateurs pour récupérer toutes les valeurs correspondantes :
<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; } } }</code>
Cette fonction renvoie faire correspondre les valeurs à l'aide du mot-clé rendement, vous permettant de les parcourir toutes avec une boucle foreach.
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!