はじめに
こんな感じにツリー形式でデータを出力をしたいと思います。
動物
-豚
-牛
植物
-野菜
--はくさい
--にんじん
-果物
--りんご
--いちご
データベースには以下のように保存してあるとします。今回は、配列で処理します。
Id | ParentId | Caption |
---|---|---|
1 | 0 | 動物 |
2 | 1 | 豚 |
3 | 1 | 牛 |
4 | 0 | 植物 |
5 | 4 | 野菜 |
6 | 5 | はくさい |
7 | 5 | にんじん |
8 | 4 | 果物 |
9 | 8 | りんご |
10 | 8 | いちご |
上記表の1行をアイテムとします。
- Id : アイテムにつける一意(重複しない番号)のIdとします。
- ParentId : そのアイテムがぶらさがるアイテムのId。例えば、豚の場合は動物につながるので、豚の ParentId は、動物の 1 を指定します。0 を root (一番上位)とします。
- Caption : アイテムの名前とします。
処理
再起処理を利用してデータを加工します。再起処理とは、関数内から自分自身の関数を呼び出して処理することをいいます。
php
<?php
// 入力元データ準備
$src = array(
array('Id'=>1, 'ParentId'=>0,'Caption'=>'動物'),
array('Id'=>2, 'ParentId'=>1,'Caption'=>'豚'),
array('Id'=>3, 'ParentId'=>1,'Caption'=>'牛'),
array('Id'=>4, 'ParentId'=>0,'Caption'=>'植物'),
array('Id'=>5, 'ParentId'=>4,'Caption'=>'野菜'),
array('Id'=>6, 'ParentId'=>5,'Caption'=>'はくさい'),
array('Id'=>7, 'ParentId'=>5,'Caption'=>'にんじん'),
array('Id'=>8, 'ParentId'=>4,'Caption'=>'果物'),
array('Id'=>9, 'ParentId'=>8,'Caption'=>'りんご'),
array('Id'=>10,'ParentId'=>8,'Caption'=>'いちご'),
);
// 出力先データ準備
$dst = array();
// 再帰で関数を呼び出します。
RecursionArray($src, 0, $dst, 0);
// 実行結果表示
echo('<pre>');
print_r($dst);
echo('</pre>');
// 再帰処理用の関数です。
function RecursionArray($src, $ParentId, &$dst, $hierarchy) {
foreach($src as $v) {
if ($v['ParentId'] == $ParentId) {
$dst[] = str_repeat('-', $hierarchy).$v['Caption'];
RecursionArray($src, $v['Id'], $dst, $hierarchy+1);
}
}
}
今回は、配列に結果を入れています。
実行結果
Array
(
[0] => 動物
[1] => -豚
[2] => -牛
[3] => 植物
[4] => -野菜
[5] => --はくさい
[6] => --にんじん
[7] => -果物
[8] => --りんご
[9] => --いちご
)
さいごに
実際の利用には、並び順なども考慮する必要があると思われます。