//测试数据 $ar = array( array(id=>1,pid=>0)、array(id=>2,pid=>0)、array(id=>3,pid=>2)、array(id=>4,pid=>0)、array( id=>5,pid=>3)、array(id=>6,pid=>1)、array(id=>7,pid=>1)、array(id=>8,pid=>6)、 array(id=>9,pid=>7), array(id=>10,pid=>9) ); //ソート関数 function cmd($a,$b) { if($a[pid]== $b[pid]) return 0; return $a[pid]>$b[pid]?1:-1; } //データ内で親ノードが子ノードの後ろに表示されるのを避けるために、複数回発生する データ変更後によく起こること // ソートの目的は、この状況によって引き起こされる混乱を防ぐことです uasort($ar,cmd) // ターゲット配列を定義します $d = array(); // インデックスを定義します記録ノードの配列 ターゲット配列の位置 $ind = array(); foreach($ar as $v) { $v[child] = array(); //各ノードに子項目を追加します。 [pid] == 0) { $i = count($d); $d[$i] = $v; $ind[$v[id]] =& $d[$i]; = count($ind [$v[pid]][子]); $ind[$v[pid]][子][$i] = $v[$v[id]] =& $ind; [$v[pid ]][child][$i]; } } //結果を確認 print_r($d); ?> アルゴリズムの特徴: B+ ツリーの概念を使用して、1 サイクルだけでツリー配列を生成できます