ホームページ > バックエンド開発 > PHPチュートリアル > モデレータさん、再帰は使わないでください。「ツリーデータの読み込み方法」にバグがあるので修正しました。

モデレータさん、再帰は使わないでください。「ツリーデータの読み込み方法」にバグがあるので修正しました。

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
リリース: 2016-06-23 14:12:42
オリジナル
905 人が閲覧しました

再帰ツリー状無限分類

モデレータの投稿が少し古いので、後で返信すると見てもらえない学生もいるのではないかと心配なので、この投稿を別に公開しました。

2013-02-04 11:46:06 に公開されたモデレーターの投稿「ツリー データの見方」にはバグがあります。
バグの説明: 子データが親データの前に出現すると、構築が失敗します。

修正してテストすると、正常に動作するようになります。ご不明な点がございましたら、テスト用にさまざまなデータを使用してください。
/** * 将“邻接列表算法”组织的数据转换成树状数组 * @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;}
ログイン後にコピー

この投稿は xuzuning によって最終編集されました: 2013-06-09 15:52:20

それは関数ですか?絶対にありません!
クエリコマンドには、pid、id 句による順序があり、「親データの前に子データ」という現象が存在しないことが保証されます

クエリ時の並べ替えは、プログラムを使用するよりもデータベース内で確実に高速です

私のものは関数 ?絶対にありません!
クエリコマンドには、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,),);
ログイン後にコピー

クエリ時にソートしてください データベースはプログラムよりも明らかに速いです
時々、データベースのソートがどれほど遅いかわかるでしょう


クエリ時にソートしてください データベースはプログラムよりも明らかに速いです
データベースがどれほど遅いかがわかるかもしれませんインデックスが作成されないため、ソートが遅くなります。または、配列ソートを使用します。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート