5
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ツリーデータを再帰処理で整形して出力する

Last updated at Posted at 2016-02-20

はじめに

こんな感じにツリー形式でデータを出力をしたいと思います。

動物
-豚
-牛
植物
-野菜
--はくさい
--にんじん
-果物
--りんご
--いちご

データベースには以下のように保存してあるとします。今回は、配列で処理します。

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] => --いちご
)

さいごに

実際の利用には、並び順なども考慮する必要があると思われます。

5
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?