以递归方式在数组中搜索键

2022-08-30 16:19:39
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";
}

嘿,此方法在关联数组中搜索特定键并返回与其关联的值。递归存在一些问题。有什么线索吗?


答案 1

也许这是矫枉过正,但使用递归迭代器:)

更新:也许对于旧版本的PHP来说,这是过度的,但是对于> = 5.6(特别是7.0),我会毫无疑问地完全使用它。

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;
        }
    }
}

更新:另外,从 PHP 5.6 开始,使用生成器,您可以轻松地迭代所有通过过滤器的元素,而不仅仅是第一个:

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
}

答案 2
function array_search_key( $needle_key, $array ) {
  foreach($array AS $key=>$value){
    if($key == $needle_key) return $value;
    if(is_array($value)){
      if( ($result = array_search_key($needle_key,$value)) !== false)
        return $result;
    }
  }
  return false;
} 

这将工作!

您需要停止递归深度搜索,通过返回 false,然后在函数中检查它。

你可以在这个链接中找到更多函数的例子(比如使用递归数组生成器等等):http://php.net/manual/en/function.array-search.php