再帰が関係する場合、多次元配列で最初に一致するキーの値を見つけるにはどうすればよいですか?

Linda Hamilton
リリース: 2024-10-30 11:43:27
オリジナル
258 人が閲覧しました

How can I find the value of the first matching key in a multidimensional array when recursion is involved?

多次元配列で最初に一致するキーの値を取得する: 再帰の問題に取り組む

ソフトウェア開発では、多次元配列をナビゲートし、特定のキーは一般的なタスクです。ただし、再帰が関係すると、事態は複雑になる可能性があります。一致するキーに関連付けられた値を見つけることを目的とした次のコード スニペットを分析してみましょう:

<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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート