PHPを使って、多次元配列を組むのに苦戦しました。
備忘録として記しておきます。
やりたい事:メニュー欄に階層が異なるカテゴリー(大分類、小分類、表題)を一行に出す
・その為に、大分類、小分類、表題の内容を取ってきて適切な配列を作る
・今回の場合、各カテゴリーがそれぞれ中に入っている形での多次元配列を作る
・表示させる時の関係で、大分類と小分類はキーとしたかった
・表題のキーはidを格納する事で、ビューからはリンクを生成、クリック後に
詳細内容が表示できるようにする
今回はコントローラーで、配列を組みました。
$list = [];
foreach ($large_categories as $large_category) {
$small_categories = $this->model_fuga->get_fuga_as_array($large_category['id']);
$small_categories_array =[];
foreach ($small_categories as $small_category) {
$contents = $this->model_piyo->get_piyo_as_array($small_category['id']);
$contents_array =[];
foreach ($contents as $content) {
$contents_array[$content['contents_id']]= $content['title'];
}
$small_categories_array[$small_category['title']] = $contents_array;
}
$list[$large_category['contents']] = $small_categories_array;
}
var-dumpすると、この様に出力されました。狙い通りです。
array(3) {
["大分類"]=>
array(1) {
["小分類"]=>
array(4) {=
[1]=>
string(18) "テストテスト"
[2]=>
string(18) "テストテスト"
[3]=>
string(18) "テストテスト"
[4]=>
string(18) "テストテスト"
}
["大分類"]=>
以下続く
}
ビューでは、このように記述する事で、別階層の各カテゴリーが一行に表示する事ができました。
<?php foreach ($list as $large_category => $small_categories): ?>
<div>
<?= $large_category ?>
</div>
<?php foreach ($small_categories as $small_title => $contents): ?>
<div>
<?= $small_title ?>
</div>
<?php foreach ($contents as $contents_id => $content): ?>
<a class="item" href=/foo/bar/<?= $contents_id ?>>
<?= $content ?>
</a>
<?php endforeach; ?>
<?php endforeach; ?>
<?php endforeach; ?>
・多次元配列は深い所から格納していく
・それぞれのforeachの最後の所で格納していく
(最後に格納しない方法もあるらしいが、本記事では割愛)
がポイントだと思います。
実際にはビュー側でどのような配列が来たら思い通りに表示されるかをイメージしてから、組んでいく配列を考えて調整していく事になりました。
コメント