プログラミング

[PHP] foreach の中でヒアドキュメントを使う方法

今年もあと残りわずか…

こんにちは!

最近ずっと実務で詰まっており頭がそっちに支配されていたため、久々のブログ更新になってしまいました。

12月も早いもので、もう中旬。仕事納めまで指折り数えられるくらいになってきました。

そんな今回ですが、先日配列のデータを表示するのに foreach の中でヒアドキュメントを使いたかったのですが、

なかなかうまくいかず時間溶かしてしまったので、どうしてうまくいかなかったのか?という理由も踏まえて今回は、

[PHP] foreach の中でヒアドキュメントを使う方法

と題して具体的な PHP の書き方についてまとめてみようと思います。

前回ブログはこちらから↓

ヒアドキュメントとは

改行を含む長い文字列を表す際に便利な方法です、よくメールの文面などで使われることが多い印象があります。

よく EOD が使われるが、最初と最後が一致すればなんでもいい。LIST とか HOGE とかでもOK。アルファベット大文字にするのが通例。

$hoge = <<<EOD
  あいうえお
  あいうえお
EOD;

foreach の中でヒアドキュメントを使う方法

想定の出力結果

下記画像の赤枠部分を foreach を使って配列のデータとDOM構造をまるっと出力したいと思います。

ソースコード

まず、行事スケジュールデータを配列 $schedule に格納します。

それを foreach を使って回して、html 内で <?=$list?> として echo します。

// 配列を定義
$schedule = array(
  'list1' => array('date' => '12月3日', 'class' => 'きりん組', 'detail' => '授業参観'),
  'list2' => array('date' => '12月6日', 'class' => 'ひよこ組', 'detail' => '身体測定'),
  'list3' => array('date' => '12月10日', 'class' => 'りす組', 'detail' => '授業参観'),
  'list4' => array('date' => '12月18日', 'class' => 'らいおん組', 'detail' => '身体測定'),
  'list5' => array('date' => '12月24日', 'class' => '合同', 'detail' => 'クリスマス会')
);

$list = ''; // 空文字で変数を初期化
// スケジュール表の DOM を生成する
foreach($schedule as $value){
  $list = <<<LIST
    <div class="record">
      <div class="date">{$value['date']}</div>
      <div class="class">{$value['class']}</div>
      <div class="detail">{$value['detail']}</div>
    </div>
LIST;
}
<body>
  <div class="scheduletable">
    <div class="title">なかよし保育園 12月の予定表</div>
    <div class="schedule">
      <div class="record">
        <div class="date">日付</div>
        <div class="class">クラス</div>
        <div class="detail">行事詳細</div>
      </div>
      <!-- foreach の結果を出力 -->
      <?=$list?>
    </div>
  </div>
</body>

なんかうまくいってそうな気がするんだけどなー。。

でも結果こうなりました。

配列 $schedule の最後の要素しか出力されてません…!

うまくいかなかった理由

これでした↓

// スケジュール表の DOM を生成する
foreach($schedule as $value){
  $list .= <<<LIST  // 代入演算子じゃなくて、結合代入演算子を使う
    <div class="record">
      <div class="date">{$value['date']}</div>
      <div class="class">{$value['class']}</div>
      <div class="detail">{$value['detail']}</div>
    </div>
LIST;
}

ヒアドキュメントを使って $list に代入する際に、代入演算子(=)じゃなくて、結合代入演算子(.=)を使わないとダメ。。

代入演算子(=)だと foreach が回るごとに $list の値が再代入されるため、結果として $schedule の最後の要素しか出力されなかった、ということのようです。

結合代入演算子(.=)を使ったら、開発ツールでみてもきちんと DOM が $schedule の要素分(5つ)出力されていて…

以下のようにちゃんと全件表示されました。

思った通りのデータが出力されたときの気持ちよさと言ったら…

まとめ

今回は foreach の中でヒアドキュメント を使う方法についてまとめてみました。

自分でやったときに結構時間溶かしてしまったので、

小さいことだけど、今回もまた1つベンキョウになりました。

全然カンケーないけど、「勉強」は中国語で「無理する」って意味なんですよね。(中国語チョトデキル)

やっぱり「学習する」って言った方がいいかな?

最後は蛇足でした…

ここまでお読みいただき、ありがとうございました!

(年末までにあと何回ブログ更新できるかな^^?)