递归函数返回false

时间:2015-03-13 13:07:50

标签: php wordpress recursion

我不知道为什么这会一直失误。

最好的部分是它实际上回声的回声。这个函数是我为WordPress编写的插件。

function find_field($field_name,$array) {
    if(array_key_exists($field_name,$array)) {
        echo 'Here';
        echo $array[$field_name];
        return $array[$field_name];
    }
    foreach($array as $value) {
        if(is_array($value)) {
            find_field($field_name,$value);
        }
    }
    return false;
}

如果我执行此操作:echo find_field('cellphone_number',$arr);

这是我的$arr

array(
    'page' => 'wp_crm_add_new',
    'wp_crm' => array(
        'user_data' => array(
            'user_id' => array(
                (int) 0 => array(
                    'value' => ''
                )
            ),
            'user_pass' => array(
                (int) 1428 => array(
                    'value' => ''
                )
            ),
            'role' => array(
                (int) 2718 => array(
                    'value' => ''
                )
            ),
            'display_name' => array(
                (int) 14454 => array(
                    'value' => 'Albert'
                )
            ),
            'user_email' => array(
                (int) 26059 => array(
                    'value' => 'albert@domain.com'
                )
            ),
            'company' => array(
                (int) 85772 => array(
                    'value' => ''
                )
            ),
            'cellphone_number' => array(
                (int) 62506 => array(
                    'value' => '0820000000'
                )
            ),
            'last_visit' => array(
                (int) 45073 => array(
                    'value' => ''
                )
            )
        )
    ),
    'meta-box-order-nonce' => '1374268beb',
    'closedpostboxesnonce' => '92fffdd685',
    'wp_crm_update_user' => '42d35393d7',
    'show_admin_bar_front' => 'false',
    'color-nonce' => 'c02f4b0a88',
    'admin_color' => 'sunrise',
    'original_publish' => 'Publish',
    'publish' => 'Save'
)

每次都得到false作为结果。我做错了什么?

1 个答案:

答案 0 :(得分:4)

这种情况正在发生,因为您返回false。这是逻辑分解:

function find_field($field_name,$array) {
    if(SOMETHING) {
        DO SOMETHING
        return SOMETHING;
    }
    foreach($array as $value) {
        if(SOMETHING) {
            CALL RECURSIVE FUNCTION
        }
    }
    return false;
}

像这样......如果你在任何时候调用函数并发送一个传递第一个if语句的值,那么你返回一个值。如果你没有传递if语句(也就是array_key不存在)那么你进入一个foreach循环,它执行一些东西,调用一个递归函数,最终返回一个值(并且不做任何事情)到最后一行代码......返回false。

在将递归函数复合为递归函数之前,首先要将其视为一次性函数。

就像任何其他函数一样,这个递归函数将在完成之前执行每行代码(尽管已中断)。你执行的最后一行代码总是"返回false"这就是你的结果。

也许你应该在调用递归函数时返回内部foreach循环值:

function find_field($field_name,$array) {
    if(array_key_exists($field_name,$array)) {
        echo 'Here';
        echo $array[$field_name];
        return $array[$field_name];
    }
    foreach($array as $value) {
        if(is_array($value)) {
           return find_field($field_name,$value);
        }
    }
    return false;
}