多くのオープンソース ソフトウェアの無限分類では再帰アルゴリズムが使用されていることはわかっていますが、再帰によって時間とスペース (メモリ) が浪費されることもわかっています。
前回、私自身のオリジナルの無限分類スパニング ツリー メソッドも共有しました。熱心な PHP 専門家のネットユーザーが私に貴重な提案をくれたので、このコードの時間が非常に短いことがわかりました。
http://www.oschina.net/code/snippet_98719_11296、再度整理してみたところ、データベース内のデータをクエリした後、すでにキー値が設定されていることがわかりました。そのため、実際には、通常、フォーマットされたメイン値をクエリします。キーの値はデータの形式に対応しているため、そのようなデータを直接使用して、ループの層を排除できます。コードも非常に簡潔です。
- /**
- * このメソッドは @Tonton によって提供されています
- * http://my.oschina.net/u/918697
- * @date 2012-12-12
- */
- function genTree5($items) {
- foreach ($items として $item)
- $items[$item['pid']]['son '][$item['id']] = &$items[$item['id']];
- isset($items[0]['son']) を返す ? $items[0]['son'] : array();
- }
- /**
- * データをツリー構造にフォーマットします
- * @author Xuefen.Tong
- * @param array $items
- * @return array
- */
- function genTree9($items) {
- $tree = array(); //格式化好的树
- foreach ($items as $item)
- if (isset($items[$item['pid']]))
- $items[$item['pid']]['son' ][] = &$items[$item['id']];
- else
- $tree[] = &$items[$item['id']];
- return $tree;
- }
- $items = array(
- 1 => array('id' => 1, 'pid' => 0, 'name' => '江西省'),
- 2 => array(' id' => 2, 'pid' => 0, '名前' => '黒竜江省'),
- 3 => 3, 'pid' => 1, 'name' => '南昌市'),
- 4 => array('id' => 4, 'pid' => 2, 'name' => 'ハルビン市'),
- 5 = > array('id' => 5, 'pid' => 2, 'name' => '集西市'),
- 6 => array('id' => 6, 'pid' => 4, '名前' => '翔坊区'),
- 7 => array('id' => 7, '名前' => '南港区' ),
- 8 => array('id' => 8, 'pid' => 6, 'name' => '六角路'),
- 9 => array('id' = > 9, 'pid' => 7, 'name' => 'Xidazhi Street'),
- 10 => array('id' => 10, 'name' => ; '東北林業大学'),
- 11 => array('id' => 11, 'pid' => 9, 'name' => 'ハルビン工業大学'),
- 12 => array('id' => 12, 'pid' => 8, 'name' => 'ハルビン師範大学'),
- 13 => array('id' => 13, ' pid' = > 1, '名前' => '甘州市'),
- 14 => 配列('id' => 14, '名前' => '甘州県') ,
- 15 => array('id' => 15, 'pid' => 13, 'name' => '玉都県'),
- 16 => array('id' => 16 , 'pid' => 14, 'name' => 'Maodian Town'),
- 17 => array('id' => 17, 'name' => '伊達天郷'),
- 18 => array('id' => 18, 'pid' => 16, 'name' => '宜源村'),
- 19 = > array('id' ' => 19, 'pid' => 16, 'name' => 'シャンバ村'),
- );
- print_r(genTree5( $items));
- print_r (genTree9($items));
-
- //後者の出力形式は、配列のキー値が異なることを除いて前者と似ていますが、データ構造には影響しません
- /*
- Array
- (
- [ 0] => 配列
- (
- [id] => 1
- [pid] => 0
- [名前] => 江西省
- [息子] => 配列
- (
- [0] =>配列
- (
- [id] => 3
- [pid] => 1
- [名前] => 南昌市
- )
-
- [1] => 配列
- (
- [id] => 13
- [pid ] => 1
- [名前] => 甘州市
- [息子] => 配列
- (
- [id] => 14
- => ; 13
- [名前] => 甘県
- [息子] => 配列
- (
- [0] => > 毛店町
- [息子] => 配列
- (
- [0] => 配列
- (
- ) [id] => 18
- [pid] => 16
- [名前] => イーユアン村
- [1] => 配列
- (
- [id] => 19
- [pid] = > [1] => 配列
- (
- [id] => 17
- [pid] => 14
- [名前] => 大田郷
- )
-
- )
-
- )
-
- [1] => 配列
- (
- [id] => 15
- [pid] => 13
- [名前] =>玉都県
- )
-
- )
-
- )
-
- )
-
- )
-
- [1] => 配列
- (
- [id] => 2
- [pid] => 0
- [name] => ;黒竜江省
- [息子] => 配列
- (
- [0] => 配列
- (
- [id] => 4
- [pid] => 2
- [名前] => ハルビン市
- [ 息子] => 配列
- (
- [0] => 配列
- (
- [id] => 6
- [pid] => 4
- [名前] => 襄坊区
- [息子] => 配列
- (
- [0] => 配列
- (
- [id] => 8
- [pid] => 6
- [名前] => 六角路
- [息子] => 配列
- (
- [0 ] => 配列
- (
- [id] => 10
- [pid] => 8
- [名前] =>
- 東北林業大学
- )
-
- [1] => 配列
- (
- [id] ] => 12
- [pid] =>
- (
- [id] => 7
- [pid] => 4
- [名前] => 南港区
- [息子] => 配列
- (
- [0] =>配列
- (
- [id] => 9
- [pid] => 7
- [name] => 配列 配列
- (
- [id] => 5
- [pid] => 2
- [名前] =>鶏西市
- )
-
- )
-
- )
- )*/
-
コードをコピー
|