私は以下の配列を持っています。 IDに対応する親のIDを持っています。この配列をソートしてツリー配列に変換する関数を作成することができます。私の問題は、親が子供の後ろにいると、それが正しく動作しないことがあるということです。PHP配列ツリーソート
どのように私は最初にソートする必要はありませんツリーに以下のような配列を有効にするでしょうか?
[0] => Array
(
[menu] =>
[parent] => 0
[id] => 1
)
,
[1] => Array
(
[menu] =>
[parent] =>
[id] => 2
)
,
[2] => Array
(
[menu] =>
[parent] => 1
[id] => 3
)
,
[3] => Array
(
[menu] =>
[parent] => 1
[id] => 4
)
,
[4] => Array
(
[menu] =>
[parent] => 4
[id] => 5
)
私が正しく動作しません。この機能を持っている:
function page_tree($rows) {
if(!is_array($rows) || empty($rows)){
return false;
}
// $rows = array(); //stores all the database rows that are to be converted into a tree
$tree = array(); //stores the tree
$tree_index = array(); //an array used to quickly find nodes in the tree
$id_column = "id"; //The column that contains the id of each node
$parent_column = "parent"; //The column that contains the id of each node's parent
$text_column = "title"; //The column to display when printing the tree to html
//build the tree - this will complete in a single pass if no parents are defined after children
// vp(count($rows));die();
// while(count($rows) > 0){
foreach($rows as $row_id => $row){
$row_id = $row['id'];
if($row[$parent_column]){
if((!array_key_exists($row[$parent_column], $rows)) and (!array_key_exists($row[$parent_column], $tree_index))){
unset($rows[$row_id]);
}
else{
if(array_key_exists($row[$parent_column], $tree_index)){
$parent = & $tree_index[$row[$parent_column]];
$parent['children'][$row_id] =$row;
$parent['children'][$row_id]["children"] = array();
$tree_index[$row_id] = & $parent['children'][$row_id];
unset($rows[$row_id]);
}
}
}
else{
$tree[$row_id] = $row;
$tree[$row_id]["children"] = array();
$tree_index[$row_id] = & $tree[$row_id];
unset($rows[$row_id]);
}
}
// }
return $tree;
}
ご注意:親がある場合(空)(= '';)それがルートであることを意味します。
簡単な質問:なぜあなたの例は '$ rows [0] [parent] == 0'ですか? – Zecc
idが0のdb行があるため、 – Val
簡単な提案:コードをより堅牢にしたいという事実を無視して、データベース内に強力なネストされたセットモデルと呼ばれる手法です。 http://dev.mysql.com/tech-resources/articles/hierarchical-data.htmlを参照してください(ネストされたセットモデルが表示されるまでスクロールダウン) – Zecc