Laravel:取得した配列を2列に並べる方法
Laravel:取得した配列を2列に並べる方法
Webカタログを作る時など1列に複数個の配列を納めたい時があります。
直打ちPHPの時は【 array_chunk() 】を使えば一発だったのですが、Laravelで使おうとした時問題が生じました。
array_chunk()使うためにはコントローラーで準備が必要!
Laravelに慣れてきてしまったため、View側で関連データを取る事が多くなりました。
こんな感じでViewで回せてしまうのでコントローラーでSQL書く事が激減しています。
直接PHP書けばいいのですが、折角のフレームワークです。viewに <?php ?> なんて書きたくはありません。
と言うことで、Controllerで取得した配列をView側で2列のリストにするため調べた結果を備忘録として記します。
Laravelにはforeach()をサポートする$loop関数がある
Laravel5.3から実装された機能で、主にループの回数などの情報をつかさどるパーツの様です。
結論を言えば「こいつが使える!」
- $loop->index:現在のループ番号 ※初期値=0
- $loop->iteration:現在の繰り返し回数 ※初期値=1
- $loop->remaining:繰返しの残り回数
- $loop->count:ループしている配列の総アイテム数
- $loop->first:ループの最初か
- $loop->last:ループの最後か
- $loop->depth:現在のループのネストレベル
- $loop->parent:ループがネストしている場合の親ループ数
アイテムを2列に並べたい訳だから、$loop->iteration を使って偶数と奇数を判別すれば実装できそうです。
<table>で配列を2列のリストにする
$loop->countで総数出して、÷2して$loop->remainingで半分に来たら<div style='float:left;width:50%' >で頭作るという方法もあります。
が、とりあえず今回は簡単な方(table)で作成してみます。
<table>
<tr>
<th>SEOワード</th>
<th>集客PT</th>
<th>サジェストPT</th>
<th>NGチェック</th>
<th>SEOワード</th>
<th>集客PT</th>
<th>サジェストPT</th>
<th>NGチェック</th>
</tr>
@foreach($seowords as $word)
@if($loop->iteration %2 !=0)
<tr>
@endif
<td>{{$word->word}}</td>
<td>{{$word->count->visit}}</td>
<td>{{$word->count->suggest}}</td>
<td>
@if((optional($word->nglist)->ng_check)===1)
<input type='checkbox' name='ng_check' value="1" checked>
@elseif((optional($word->nglist)->ng_check)===0)
<input type='checkbox' name='ng_check' value="1">
@else
―
@endif
</td>
@if($loop->iteration %2 ==0)
</tr>
@endif
@endforeach
</table>
解説のようなもの
奇数の時に<tr>を書いて、偶数の時に</tr>を書けば1行に2つのレコードを含んだテーブルが作成できます。
$loop->iterationで現在のループ数を取得できるので、こいつが偶数か奇数かを判断して指示すれば望みの形は出来上る訳です。
■奇数の時<tr>を書く
@if($loop->iteration %2 !=0)
<tr>
@endif
■偶数の時</tr>を書く
@if($loop->iteration %2 ==0)
</tr>
@endif
$loopを使った方法は『カタログリスト』などに流用できる
この方法を使えば、商品の画像を5個並べたカタログリストなどを簡単に作成できます。
あ、でもcatalogの場合はフロート使って<div>並べた方が早いですね。
まとめ
Laravelには便利な関数がいくつも用意されていて、使い方次第でいろいろな事が出来ます。
「array_chunk()が使えない!」と思った時は頭痛くなりましたが、さすがララベルさん、引き出しは潤沢でした。
便利だなぁ、やっぱり。


