本帖最後由 qq43599939 於 2013-08-28 12:42:25 編輯
array('id'=>1,'name'=>'中國','pid'=>0), 1=>array('id'=>2,'name'=>'北京','pid'=>1), ); print_r(catsort($area)); function catsort($cate, $pid = 0){ $arr = array(); foreach($cate as $v){ if ($v['pid'] == $pid){ $arr[] = $v; $arr = array_merge($arr, catsort($cate ,$v['id'])); //$arr[] = $v; } } return $arr; } ?>
這個問題讓我很困惑,為什麼 $arr[] = $v放在$arr = array_merge($arr, catsort($cate ,$v['id']))前面返回的先是中國,然後才是北京。而放到$arr = array_merge($arr, catsort($cate ,$v['id']))後面的時候卻是北京先,後中國呢?請幫忙詳細解釋下,謝謝
回複討論(解決方案)
你至少應該閱讀過關於書的遍曆吧?
遞迴就是遍曆一顆樹
根據訪問結點操作發生位置命名:
① NLR:前序走訪(PreorderTraversal亦稱(先序遍曆))
??訪問根結點的操作發生在遍曆其左右子樹之前。
② LNR:中序遍曆(InorderTraversal)
??訪問根結點的操作發生在遍曆其左右子樹之中(間)。
③ LRN:後序遍曆(PostorderTraversal)
??訪問根結點的操作發生在遍曆其左右子樹之後。
$arr[] = $v放在$arr = array_merge($arr, catsort($cate ,$v['id']))前面
是前序走訪
放到$arr = array_merge($arr, catsort($cate ,$v['id']))後面
是後序遍曆
那為什麼放在前面就是前序,後面就是後序,不是很理解,能在說清楚點嗎
foreach($cate as $v){ if ($v['pid'] == $pid){ $arr[] = $v; $arr = array_merge($arr, catsort($cate ,$v['id'])); //$arr[] = $v; } }
放前面的時候,中國先加到$arr中的沒什麼好說的。
foreach($cate as $v){ if ($v['pid'] == $pid){ //$arr[] = $v; $arr = array_merge($arr, catsort($cate ,$v['id'])); //這裡catsort進入遞迴 $arr[] = $v; } }
放後面的時候,外層的array_merge函數處理第二個參數"catsort($cate,$v['id'])"時,遞迴進入裡層,在裡層執行了"$arr[]=$v",把北京先加入到了數組中,然後才返回外層,執行外層的"$arr[]=$v".
搞懂了,thank you