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