階層構造の再帰処理
多次元配列の階層構造をリスト表示したくて Google 先生へ質問した結果。
【環境】
php:5.4.7
php:5.4.7
手法
時間がないので、参考サイトの中から採用したものをコピペ。
- $data = [
- [
- 'hoge_id' => 2,
- 'hoge' => '親2',
- 'parent_id' => 0,
- ],
- [
- 'hoge_id' => 8,
- 'hoge' => '孫',
- 'parent_id' => 4,
- ],
- [
- 'hoge_id' => 3,
- 'hoge' => '子2-1',
- 'parent_id' => 2,
- ],
- [
- 'hoge_id' => 4,
- 'hoge' => '子7-1',
- 'parent_id' => 7,
- ],
- [
- 'hoge_id' => 7,
- 'hoge' => '親7',
- 'parent_id' => 0,
- ],
- [
- 'hoge_id' => 1,
- 'hoge' => '親1',
- 'parent_id' => 0,
- ]
- ];
- class HtmlUlBuilder
- {
- private $data;
- public function __construct($data)
- {
- $this->data = $data;
- }
- public function buildFromParent($parent_id)
- {
- $children = array_filter($this->data, function ($element) use ($parent_id) {
- return $element['parent_id'] === $parent_id;
- });
- if (count($children) === 0) return '';
- return '<ul>' . array_reduce($children, function ($current, $element) {
- return $current . PHP_EOL . '<li>' . $element['hoge'] . $this->buildFromParent($element['hoge_id']) . '</li>';
- }, '') . '</ul>';
- }
- }
- usort($data, function ($a, $b) {
- return $a['hoge_id'] > $b['hoge_id'];
- });
- $builder = new HtmlUlBuilder($data);
- $html = $builder->buildFromParent(0);
- echo $html;
参考サイト
stack overflow:PHP多次元配列から階層リストタグ(略)を出力したい