再帰ツリー状無限分類
モデレータの投稿が少し古いので、後で返信すると見てもらえない学生もいるのではないかと心配なので、この投稿を別に公開しました。/** * 将“邻接列表算法”组织的数据转换成树状数组 * @param array 二维数据数组 * @return array 多维树状数组 */function tree($arr){ $res = array(); //结果数组 $ind = array(); //索引数组 foreach($arr as $k=>$v) { list($id, $pid) = array_values($v); if(isset($ind[$id])){ $ind[$id] = array_merge($v, $ind[$id]); }else{ $ind[$id] = $v; } $ind[$pid]['child'][$id] = &$ind[$id]; //构造索引 if($pid == 0) $res[$id] = &$ind[$id]; //转存根节点组 } return $res;}// 测试用数组$arr = array( array('id'=>9, 'pid'=>12,), array('id'=>10, 'pid'=>13,), array('id'=>11, 'pid'=>13,), array('id'=>12, 'pid'=>14,), array('id'=>14, 'pid'=>0,), array('id'=>15, 'pid'=>0,), array('id'=>13, 'pid'=>14,), array('id'=>17, 'pid'=>15,), array('id'=>16, 'pid'=>17,), array('id'=>18, 'pid'=>16,), array('id'=>19, 'pid'=>15,),);
バージョンを更新する
/** * 将“邻接列表算法”组织的数据转换成树状数组 * @param array 二维数据数组 * @param int 要查找的父ID * @return array 多维树状数组 */function tree($arr, $parent_id = 0){ $tmp = array(); foreach($arr as $k=>$v) { list($id, $pid) = array_values($v); if(isset($tmp[$id])){ $tmp[$id] = array_merge($v, $tmp[$id]); }else{ $tmp[$id] = $v; } $tmp[$pid]['child'][$id] = &$tmp[$id]; } $list = array(); if(0 == $parent_id){ $list = $tmp[0]['child']; }else{ $list = $tmp[$parent_id]; } unset($tmp); return $res;}
それは関数ですか?絶対にありません!
クエリ時の並べ替えは、プログラムを使用するよりもデータベース内で確実に高速です
私のものは関数 ?絶対にありません!
クエリコマンドには、order by pid, id 句があり、「親データの前に子データ」という現象が存在しないことが保証されています
次の配列が order by pid, id に準拠しているかどうかはわかりません
$arr = array( array('id'=>13, 'pid'=>0,), array('id'=>14, 'pid'=>0,), array('id'=>9, 'pid'=>12,), array('id'=>10, 'pid'=>13,), array('id'=>11, 'pid'=>13,), array('id'=>12, 'pid'=>14,),);
クエリ時にソートしてください データベースはプログラムよりも明らかに速いです
時々、データベースのソートがどれほど遅いかわかるでしょう
クエリ時にソートしてください データベースはプログラムよりも明らかに速いです
データベースがどれほど遅いかがわかるかもしれませんインデックスが作成されないため、ソートが遅くなります。または、配列ソートを使用します。