递归函数返回 false


Recursive function returning false

我不知道为什么这总是返回false。

最好的部分是它实际上回声的回声陈述。这个函数在我为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。我做错了什么?

发生这种情况是因为您返回 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",它抛出您的结果。

也许你应该在调用递归函数时返回内部 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;
}