多次元配列で最初に一致するキーの値を取得する: 再帰の問題に取り組む
ソフトウェア開発では、多次元配列をナビゲートし、特定のキーは一般的なタスクです。ただし、再帰が関係すると、事態は複雑になる可能性があります。一致するキーに関連付けられた値を見つけることを目的とした次のコード スニペットを分析してみましょう:
<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>
問題は再帰自体の中にあります。干し草の山内で配列が見つかると、ファイル変数が新しい干し草の山になります。ただし、元の干し草の山への参照が失われ、永遠の再帰サイクルが発生する可能性があります。
これに対処するには、次の解決策を検討してください。
RecursiveIteratorIterator
PHP 5.6 以降では、タスクを大幅に簡素化する RecursiveIteratorIterator が導入されています。
<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>
このアプローチは、配列を走査する RecursiveArrayIterator と、ネストされた配列を含むすべての要素を効率的に反復する RecursiveIteratorIterator を利用します。
ジェネレーターベースの関数
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) { yield $value; } } }</code>
この関数は次の値を返します。 yield キーワードを使用して値を照合すると、foreach ループですべての値を反復処理できるようになります。
以上が再帰が関係する場合、多次元配列で最初に一致するキーの値を見つけるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。