递归函数没有停止?

时间:2015-12-07 15:50:20

标签: 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 === $needle) {
            return $value;
        }
    }
}

(部分)数组:

$oLayoutProperties = 
Array
(
[header] => Array
    (
        [logo_float] => left
        [logo_upload] => http://placehold.it/150x100&text=afbeelding
        [logo_margin_top] => 0
        [searchbar_toggle] => false
        [language_toggle] => false
        [color] => 0
        [font_size] => 12
        [background_color] => 0
    )

[menu] => Array
    (
        [menu_type] => full
        [menu_align] => left
        [menu_position_toggle] => false
        [menuheight] => Array
            (
                [bar_height] => 0
            )

        [color] => 0
        [font_size] => 12
        [text_transform] => like_pagetitle
        [background_color_hover] => 0
        [color_hover] => 0
    )

[submenu] => Array
    (
        [color] => 0
        [font-size] => 12
        [item_height] => 0
        [item_width] => 0
        [text-transform] => like_pagetitle
        [background_color] => 0
        [background_color_hover] => 0
        [color_hover] => 0
    )
)

我将该函数调用如下:

$oElement_controller->find_key_recursive($oLayoutProperties, 'logo_float');

我验证了(使用echo)确实找到了'logo_float'键,但我似乎无法取消递归函数?

我尝试了以下内容:

  • return false;
  • 中断;

以上都不适用。 你如何停止递归函数?

3 个答案:

答案 0 :(得分:1)

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,但这样的事情可能会奏效。

答案 1 :(得分:1)

您可以使用static变量来记住多个函数调用之间的状态。它使函数在多次调用之间记住给定变量(在此示例中为$needle_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;
        }
    }
}

此函数最终返回$needle_value,这是您在大海捞针中所需的针。

答案 2 :(得分:0)

您可以将结果放在通过引用传递的变量中,如下所示:

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