/**
* このメソッドは @Tonton によって提供されています
* http://my.oschina.net/u/918697
* @日付 2012-12-12
*/
関数 genTree5($items) {
foreach ($items を $item として)
$items[$item['pid']]['son'][$item['id']] = &$items[$item['id']]
isset($items[0]['son']) $items[0]['son'] : array(); を返します。
} www.2cto.com
/**
* データをツリー構造にフォーマットします
* @著者 Xuefen.Tong
* @param 配列 $items
* @return 配列
*/
関数 genTree9($items) {
$tree = array() //フォーマットされたツリー
foreach ($items を $item として)
if (isset($items[$item['pid']]))
$items[$item['pid']]['son'][] = &$items[$item['id']]
その他
$tree[] = &$items[$item['id']]
$tree を返す
}
$items = array(
1 => array('id' => 1, 'pid' => 0, 'name' => '江西省')、
2 => array('id' => 2, 'pid' => 0, 'name' => '黒竜江省')、
3 => array('id' => 3, 'pid' => 1, 'name' => '南昌市')、
4 => array('id' => 4, 'pid' => 2, 'name' => 'ハルビン市'),
5 => array('id' => 5, 'pid' => 2, 'name' => '鶏西市'),
6 => array('id' => 6, 'pid' => 4, 'name' => 'Xiangfang District'),
7 => array('id' => 7, 'pid' => 4, 'name' => '南港区'),
8 => array('id' => 8, 'pid' => 6, 'name' => '六角路'),
9 => array('id' => 9, 'pid' => 7, 'name' => '西達街'),
10 => array('id' => 10, 'pid' => 8, 'name' => '東北林業大学'),
11 => array('id' => 11, 'pid' => 9, 'name' => 'ハルビン工業大学'),
12 => array('id' => 12, 'pid' => 8, 'name' => 'ハルビン師範大学'),
13 => array('id' => 13, 'pid' => 1, 'name' => '甘州市')、
14 => array('id' => 14, 'pid' => 13, 'name' => 'ガン郡')、
15 => array('id' => 15, 'pid' => 13, 'name' => '玉都県'),
16 => array('id' => 16, 'pid' => 14, 'name' => 'Maodian Town'),
17 => array('id' => 17, 'pid' => 14, 'name' => '大丹郷'),
18 => array('id' => 18, 'pid' => 16, 'name' => '宜源村'),
19 => array('id' => 19, 'pid' => 16, 'name' => 'シャンバ村'),
);
エコー "";
print_r(genTree5($items));
print_r(genTree9($items));
//後者の出力形式は、配列のキー値が異なることを除いて前者と似ていますが、データ構造には影響しません
/*
配列
(
[0] => 配列
(
[ID] = > 1
= [ピッド] = & gt;
[名前] => 江西省
[息子] => 配列
(
[0] =>
(
...
)
[1] => 配列
(
to
...
(
to
️
️
️
️
[id] => 18
[pid] => 16
[名前] => 义源村
)
[1] =>配列
(
[id] => 19
[pid] => 16
[名前] => 上坝村
)
)
)
[1] =>配列
(
[id] => 17
[pid] => 14
[名前] => 大田乡
)
)
)
[1] =>配列
(
️
️
)
)
)
[1] => 配列
(
[ID] = > 2
= [ピッド] = & gt;
[名前] => 黒竜江省
[息子] => 配列
(
[0] =>
(
to
...
(
になります
(
~
️
️
️
️
東北林業大学
️
ハルビン師範大学
️
️
️
️
になります
(
️
[息子] =>配列
(
[0] =>配列
(
[id] => 9
[pid] => 7
[名前] => 西大直街
[息子] =>配列
(
[0] =>配列
(
[id] => 11
[pid] => 9
[名前] =>
哈尔滨工业大学
)
)
)
)
)
)
[1] =>配列
(
[id] => 5
[pid] => 2
[名前] => 鸡西市
)
)
)
)*
テストを通じて、想像上の無限レベルの分類を完了できますが、独自のデータでは使用できますが、次のようなエラーが発生します。
[php]
配列
(
[10] => 配列
(
...
(
[14] =>
)
)
[11] =>
[12] =>
[9] => 配列
(
...
(
[13] =>
)
)
)
アレイのシリアル番号のみが表示され、対応するデータが表示されないのですが、テスト後に完全に表示できるようになります。
[php]
関数 genTree5($items) {
foreach ($items として $item) {
$items[$item['id']]=$item;//これを追加
$items[$item['pid']]['son'][$item['id']] = &$items[$item['id']]
}
isset($items[0]['son']) $items[0]['son'] : array(); を返します。
}
ただし、これはIDの昇順でのみ使用できます。順序が間違っている場合は、エラーが表示されます
。
ほとんどの場合、idは昇順のままですが、ソートを伴う場合は使用できません。
以前、CI の Lu 先生は次のような効率的な方法を提供しました:
[php]
ID 親 ID 評価
1 0 0,1
2 1 0、1、2
3 1 0、1、3
4 3 0、1、3、4
成績順の表から * を選択してください
この構造は、採点を親子順に並べ替えます。最初に最初の 0 が並べ替えられ、次に 2 番目の 1 が並べ替えられます。自動分類され、非常に使いやすいです (同時に 2 つのグループを必ず保持し、 0,1 または 0,0 から始まります。それ以外の場合は、ルート レベルが事前に表示されます)。 「分類」はレコードのサブ ID 層であるため、childid とも呼ばれます。
[php]
|--2
|----2-1
|------2-1-1
|--3
|----3-1
|--4
|--1
|----1-1
深度を記録するための深度フィールドがあるため、ディスプレイを直接横断することができ、より適切に表示できます。
このメソッドの実行時間も短く、マイクロ秒単位で実行されます。つまり、データベースのソートに費やされ、残りは基本的に非常に楽しいものになります。
ポインターを使用すると、キャッシュを使用しないテストのほとんどは、並べ替え後の時間 (主に CPU 時間) より長くなり、結果は不正確になります。
追記:PHPはアドレスやポインタなどの概念が弱くなっています。つまり、PHPの機能ではありませんが、使用することはできますが、いくつかの不可解なエラーが発生します。正直に言うと、Shenma ビッグデータ アルゴリズムは PHP などで実行する必要はなく、PHP よりもはるかに高速です。 。 。 。
その間、@Tonton はアルゴリズムを修正します。
http://www.bkjia.com/PHPjc/477766.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/477766.html
技術記事 CI の 7 は、次のようなメソッドを提供してくれました。 [php] ?php /*** このメソッドは @Tonton によって提供されています * http://my.oschina.net/u/918697 * @date 2012-12-12*/ function genTree5($items) { fore...