以recursion方式search数组中的键

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

嘿,这个方法在关联数组中search一个特定的键,并返回与它关联的值。 recursion有一些问题。 任何线索?

也许这是矫枉过正,但使用RecursiveIterators是有趣的:)

更新:也许是旧版本的PHP,但与> = 5.6(特别是7.0)矫枉过正,我会完全使用这个毫无疑问。

 function recursiveFind(array $array, $needle) { $iterator = new RecursiveArrayIterator($array); $recursive = new RecursiveIteratorIterator( $iterator, RecursiveIteratorIterator::SELF_FIRST ); foreach ($recursive as $key => $value) { if ($key === $needle) { return $value; } } } 

更新:另外,从PHP 5.6起,使用生成器可以轻松遍历所有通过filter的元素,而不仅仅是第一个:

 function recursiveFind(array $haystack, $needle) { $iterator = new RecursiveArrayIterator($array); $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 } 
 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; } 

这将工作!

你需要停止recursion深度search,通过返回false然后在函数中检查它。

你可以在这个链接中find更多函数的例子(比如使用RecursiveArrayIterator等): http : //php.net/manual/en/function.array-search.php

由xPheRe提供的答案是非常有用的,但没有完全解决我的实现中的问题。 在我们的数据结构中有多个嵌套关联数组,并且可能有多个给定键的出现。

为了达到我们的目的,我需要实现一个在遍历整个结构时更新的持有者数组,而不是在第一场比赛中返回。 真正的工作是由另一张海报提供的,但我想说谢谢,并分享我不得不掩盖的最后一步。

 public function recursiveFind(array $array, $needle) { $iterator = new RecursiveArrayIterator($array); $recursive = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::SELF_FIRST); $aHitList = array(); foreach ($recursive as $key => $value) { if ($key === $needle) { array_push($aHitList, $value); } } return $aHitList; } 

尝试这个:

 array_walk_recursive( $arrayToFindKey, function($value, $key, $matchingKey){ return (strcasecmp($key, $matchingKey) == 0)? true : false; } , 'matchingKeyValue' ); 

上面的最好的解决scheme错过了这种情况,如果重复键,只返回第一个值,在这里我得到的是数组中的所有值:

 function recursiveFind(array $array, $needle) { $iterator = new RecursiveArrayIterator($array); $recursive = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::SELF_FIRST); $return = []; foreach ($recursive as $key => $value) { if ($key === $needle) { $return[] = $value; } } return $return; }