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哦,是的,现在我明白你的意思了。有了第三个可选参数,这将变得更加容易。好的观点。:)