Maison >développement back-end >tutoriel php >PHP一个递归方法返回值的问题
<code><?php $array = array( 0 => 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始终为空 </code>
这个方法的意思就是给一下标$key
取出对应val
的值,我在方法最后return $v
,然后我把这个return
的结果赋给一个值$va
,这个值始终为空,但是我在方法最后打印$v的时候是有值的,为什么会这样呢?是变量作用域的问题还是我代码写的不规范导致的?求解
<code><?php $array = array( 0 => 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始终为空 </code>
这个方法的意思就是给一下标$key
取出对应val
的值,我在方法最后return $v
,然后我把这个return
的结果赋给一个值$va
,这个值始终为空,但是我在方法最后打印$v的时候是有值的,为什么会这样呢?是变量作用域的问题还是我代码写的不规范导致的?求解
function 改成下面这样,你这逻辑有点问题,方法间数据交互要使用return,最后取得值可当是search_val给你返回的所以直接在这边return。
<code class="php"> 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); } </code>
直白的说递归就是自己调用自己。
而你的代码里面函数调用自身却没有获取其返回值。
其次要注意对自身返回结果的处理。
<code>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; }</code>