首頁  >  文章  >  後端開發  >  如何在 PHP 中遞歸搜​​尋多維數組中的鍵?

如何在 PHP 中遞歸搜​​尋多維數組中的鍵?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-02 15:58:30810瀏覽

How to Recursively Search for a Key in a Multidimensional Array in PHP?

在多維數組中遞歸搜尋鍵

問題:

提供的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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn