首頁  >  文章  >  後端開發  >  當涉及到遞歸時,如何找到多維數組中第一個匹配鍵的值?

當涉及到遞歸時,如何找到多維數組中第一個匹配鍵的值?

Linda Hamilton
Linda Hamilton原創
2024-10-30 11:43:27192瀏覽

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

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