Php 递归函数不停止?
我创建了一个递归函数来在多维数组中查找键值 功能:Php 递归函数不停止?,php,arrays,recursion,Php,Arrays,Recursion,我创建了一个递归函数来在多维数组中查找键值 功能: public function find_key_recursive($haystack, $needle) { foreach($haystack as $key=>$value) { if(is_array($value)){ $this->find_key_recursive($value, $needle); } else if($key === $needl
public function find_key_recursive($haystack, $needle) {
foreach($haystack as $key=>$value) {
if(is_array($value)){
$this->find_key_recursive($value, $needle);
} else if($key === $needle) {
return $value;
}
}
}
(部分)阵列:
我按如下方式调用该函数:
$oElement_controller->find_key_recursive($oLayoutProperties, 'logo_float');
我验证(使用echo)确实找到了键“logo\u float”,但我似乎无法取消递归函数
public function find_key_recursive($haystack, $needle) {
foreach($haystack as $key=>$value) {
if(is_array($value)){
var $found = $this->find_key_recursive($value, $needle);
if ($found){
return $found;
}
} else if($key === $needle) {
return $value;
}
}
return false;
}
我尝试了以下方法:
$oElement_controller->find_key_recursive($oLayoutProperties, 'logo_float');
- 返回false李>
- 中断李>
public function find_key_recursive($haystack, $needle) {
foreach($haystack as $key=>$value) {
if(is_array($value)){
var $found = $this->find_key_recursive($value, $needle);
if ($found){
return $found;
}
} else if($key === $needle) {
return $value;
}
}
return false;
}
我已经有一段时间没有接触过PHP了,但是类似的东西可能会起作用。您可以使用
静态变量来记住多个函数调用之间的状态。它使函数在多次调用之间记住给定变量的值($pinder\u value
)
public function find_key_recursive($haystack, $needle){
static $needle_value = null;
if($needle_value != null){
return $needle_value;
}
foreach($haystack as $key=>$value) {
if(is_array($value)){
$this->find_key_recursive($value, $needle);
} else if($key === $needle) {
$needle_value = $value;
return $needle_value;
}
}
}
此函数最终返回$pinder\u value
,这是大海捞针所需的指针。您可以将结果放入通过引用传递的变量中,如下所示:
public function find_key_recursive($haystack, $needle, &$found) {
foreach($haystack as $key => $value) {
if (is_array($value)) {
$this->find_key_recursive($value, $needle, $found);
} else if($key === $needle) {
$found = $value;
return;
}
}
}
$found = false;
$oElement_controller->find_key_recursive($oLayoutProperties, 'logo_float', $found);
if ($found !== false) {
// found!
}
您不能在任何地方返回递归调用。在循环数组中的每个元素之前,我还要检查array\u key\u是否存在。如果是,只需返回$haystack[$pineel]
而不返回循环即可。如果键确实存在,但其值为null
,则函数将简单地返回null
,就好像找不到键一样。您需要考虑一种方法来区分空值和找不到的键好的,这是一个比我更好的答案。但是有一件事:var$found=
应该是$found=
为什么OP要尝试这个?一个好的答案总会有一个解释,说明做了什么以及为什么这样做,不仅是为了OP,而且是为了未来的访客。谢谢你的“生锈”PHP,它比我的好!多亏了你的榜样,我才明白我错过了什么!或者您可以将$needle\u value
作为第三个可选参数传递给递归。对于一些维护开发人员来说,这可能更好,因为他们不需要理解静力学。@kojiro哦,是的,现在我明白你的意思了。有了第三个可选参数,这将变得更加容易。好的观点。:)