問題:
提供された find() メソッドは再帰的に検索を試みます連想配列内の特定のキーを検索し、関連付けられた値を返します。ただし、再帰の実装には問題があります。
解決策:
元のコードの問題は再帰に関連しています。現在のレベルで一致が見つからない場合は処理せずに、再帰呼び出しの出力を直接返そうとします。これにより、一致が配列の奥深くに存在するかどうかに関係なく、「見つかりませんでした」という誤った戻り値が発生する可能性があります。
これを修正するには、次のコードを使用して再帰を正しく処理できます。
<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>
この更新された関数は、再帰呼び出しの結果が「見つからなかった」かどうかをチェックし、より深いレベルで一致が見つかったことを示します。その場合、見つかった値を返します。それ以外の場合は、以前と同様に「見つかりませんでした」値を返します。
代替ソリューション:
最新の PHP バージョン (5.6 以降) では、反復子と反復子を利用した代替ソリューションが使用されます。 /または、ジェネレーターをより効率的かつエレガントにすることができます:
<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>
この関数はイテレーターを使用して、多次元配列を効率的に走査し、最初に一致するキーを見つけます。
さらに、ジェネレーターを使用して反復処理を行うこともできます。最初の要素だけでなく、一致するすべての要素に対して:
<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>
以上がPHP で多次元配列内のキーを再帰的に検索するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。