###前提・実現したいこと
PHP初心者です。
一次元の配列から、階層構造の配列を作成したいのですが再帰処理を使用したことがなく、うまく出来ずにいます。
元データから、2つの結果を導きたいです。
導き出した配列はメニュー用に表示したりして使おうと思っています。
わかりやすい方法、短く書くことが出来る方法、やテクニカルな方法など色々な形を見たいです。
もしくは、結果の構造はこっちのほうが良いよ、などのアドバイスなどもあれば是非聞きたいです。
(元はparent
なのにchildren
を作ろうとしていることに少し違和感があります)
よろしくお願いします!
PHP
1// 元データ 2$original = [ 3 // id, 親id, 名前 4 ['id' => 1, 'parent' => 0, 'name' => 'aaaa'], 5 ['id' => 2, 'parent' => 0, 'name' => 'bbbb'], 6 ['id' => 3, 'parent' => 1, 'name' => 'cccc'], 7 ['id' => 4, 'parent' => 2, 'name' => 'dddd'], 8 ['id' => 5, 'parent' => 3, 'name' => 'eeee'], 9];
PHP
1// 1つ目はこの結果が欲しい 2$result1 = [ 3 1 => [ 4 'catname' => 'aaaa', // 名前を連結する 5 'name' => 'aaaa', 6 'children' => [ 7 3 => [ 8 'catname' => 'aaaa cccc', 9 'name' => 'cccc', 10 'children' => [ 11 5 => [ 12 'catname' => 'aaaa cccc eeee', 13 'name' => 'eeee', 14 'children' => [], 15 ], 16 ], 17 ], 18 ], 19 ], 20 2 => [ 21 'catname' => 'bbbb', 22 'name' => 'bbbb', 23 'children' => [ 24 4 => [ 25 'catname' => 'bbbb dddd', 26 'name' => 'dddd', 27 'children' => [], 28 ], 29 ], 30 ], 31];
PHP
1 2// 2つ目はこの結果が欲しい 3$result2 = [ 4 1 => 'aaaa', 5 2 => 'bbbb', 6 3 => 'aaaa cccc', 7 4 => 'bbbb dddd', 8 5 => 'aaaa cccc eeee', 9]; 10
追記
@mts10806さん
途中のソース
半端ですがこちらです。id => 5
が出来ていません。また、catname
も出来ていません。
引数の参照渡しについて今ひとつ理解できていませんが、これがわかりにくくさせてる気もしています。
再帰処理は参照渡しが必要になってしまうものですか?returnで返したほうがわかりやすい気がしています。
子要素を作る処理が2回出てきている('children' => []
を2箇所でしてる)ので、何か違うなとも思っています。
PHP
1 2function recursive(&$result, $array) { 3 if ($array['parent'] === 0) { 4 $result[$array['id']] = [ 5 'name' => $array['name'], 6 'children' => [], 7 ]; 8 } else { 9 if (isset($result[$array['parent']])) { 10 $result[$array['parent']]['children'][$array['id']] = [ 11 'name' => $array['name'], 12 'children' => [], 13 ]; 14 } else { 15 foreach ($result as $array2) { 16 recursive($array2['children'], $array['parent']); 17 } 18 } 19 } 20} 21 22$original = [ 23 ['id' => 1, 'parent' => 0, 'name' => 'aaaa'], 24 ['id' => 2, 'parent' => 0, 'name' => 'bbbb'], 25 ['id' => 3, 'parent' => 1, 'name' => 'cccc'], 26 ['id' => 4, 'parent' => 2, 'name' => 'dddd'], 27 ['id' => 5, 'parent' => 3, 'name' => 'eeee'], 28]; 29 30$result = []; 31foreach ($original as $array) { 32 recursive($result, $array); 33} 34var_dump($result); 35
回答3件
あなたの回答
tips
プレビュー