递归函数返回 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;
}
我不知道为什么这总是返回 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;
}