递归函数返回 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 作为结果。我做错了什么?

发生这种情况是因为您 return 错误。这是逻辑分解:

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

这样说...如果您在任何时候调用该函数并发送一个通过第一个 if 语句的值,那么您 return 一个值。如果你不传递那个 if 语句(也就是 array_key 不存在),那么你将进入一个 foreach 循环,它会做一些事情,调用一个递归函数,最终 return 是一个值(并且什么都没有)在继续最后一行代码之前... return false.

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

就像任何其他函数一样,这个递归函数将在完成之前执行每一行代码(尽管被中断)。您执行的最后一行代码始终是 "return false",它会抛出您的结果。

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