PHP一个递归方法返回值的问题
程序员文章站
2023-12-25 10:26:27
...
array(
'1a' => '',
'3a' => '',
'6a' => array(
'6a1' => '',
'6a2' => '',
'6a3' => array(
'6a31' => '',
'6a33' => '',
'6a34' => '1',
),
),
),
1 => array(
'3b' => '',
'4b' => array(
'4b1' => '',
'4b2' => '',
),
'6b' => '',
)
);
function search_val($key, $arr) {
$v = '';
foreach ($arr as $ks => $vs) {
if($ks != $key && is_array($vs)) {
search_val($key, $vs);
}else if($ks != $key && is_string($vs)) {
continue;
}else if($ks == $key) {
$v = $vs;
break;
}
}
return $v;
//var_dump($v);exit; //这里是有值的 为1
//echo $v; //测试这样可以直接输出
}
$va = search_val('6a34', $array);
var_dump($va); //$va始终为空
这个方法的意思就是给一下标$key
取出对应val
的值,我在方法最后return $v
,然后我把这个return
的结果赋给一个值$va
,这个值始终为空,但是我在方法最后打印$v的时候是有值的,为什么会这样呢?是变量作用域的问题还是我代码写的不规范导致的?求解
回复内容:
array(
'1a' => '',
'3a' => '',
'6a' => array(
'6a1' => '',
'6a2' => '',
'6a3' => array(
'6a31' => '',
'6a33' => '',
'6a34' => '1',
),
),
),
1 => array(
'3b' => '',
'4b' => array(
'4b1' => '',
'4b2' => '',
),
'6b' => '',
)
);
function search_val($key, $arr) {
$v = '';
foreach ($arr as $ks => $vs) {
if($ks != $key && is_array($vs)) {
search_val($key, $vs);
}else if($ks != $key && is_string($vs)) {
continue;
}else if($ks == $key) {
$v = $vs;
break;
}
}
return $v;
//var_dump($v);exit; //这里是有值的 为1
//echo $v; //测试这样可以直接输出
}
$va = search_val('6a34', $array);
var_dump($va); //$va始终为空
这个方法的意思就是给一下标$key
取出对应val
的值,我在方法最后return $v
,然后我把这个return
的结果赋给一个值$va
,这个值始终为空,但是我在方法最后打印$v的时候是有值的,为什么会这样呢?是变量作用域的问题还是我代码写的不规范导致的?求解
function 改成下面这样,你这逻辑有点问题,方法间数据交互要使用return,最后取得值可当是search_val给你返回的所以直接在这边return。
function search_val($key, $arr) {
foreach ($arr as $ks => $vs) {
if($ks != $key && is_array($vs)) {
return search_val($key, $vs);
}else if($ks != $key && is_string($vs)) {
continue;
}else if($ks == $key) {
return $vs;
}
}
//return $v;
//var_dump($v);
}
直白的说递归就是自己调用自己。
而你的代码里面函数调用自身却没有获取其返回值。
其次要注意对自身返回结果的处理。
function search_val($key, $arr) {
if (!is_array($arr) || empty($arr)) {
return false;
} else {
foreach ($arr as $k => $v) {
if ($k === $key) {
return $v;
}
if (is_array($v) && !empty($v)) {
$re = search_val($key, $v);
if ($re !== false) {
return $re;
}
}
continue;
}
}
return false;
}