<?php $area = array( 0=>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; } ?>
少なくとも本の横断については読んだはずですよね?
再帰とは、ツリーを走査することです
ノードへのアクセス操作が発生する場所に応じて名前が付けられます:
① NLR: Preorder Traversal (Preorder Traversal とも呼ばれます)
??ルート ノードへのアクセス操作は、ルート ノードを走査するときに発生します。木の前の左右の子供たち。
② LNR: Inorder Traversal (InorderTraversal)
??ルートノードにアクセスする操作は、その左右のサブツリーのトラバース中に発生します。
③ LRN: Postorder Traversal
??ルート ノードにアクセスする操作は、左右のサブツリーを走査した後に発生します。
$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; } }
後ろに配置した場合、外側の array_merge 関数が第 2 パラメータ「catsort($cate,$v['id'])」を処理するときに、再帰的に内側の層に入り、「$arr」を実行します。内側の層 []=$v" を実行し、最初に配列に北京を追加してから、外側の層に戻って外側の層の "$arr[]=$v" を実行します。
わかりました、ありがとう