【PHP】多次元配列を組んだ時の備忘録

PHP

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の最後の所で格納していく
(最後に格納しない方法もあるらしいが、本記事では割愛)

がポイントだと思います。

実際にはビュー側でどのような配列が来たら思い通りに表示されるかをイメージしてから、組んでいく配列を考えて調整していく事になりました。

コメント

タイトルとURLをコピーしました