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;}