【php】array_chunk()は便利だよ
問題
フラットに並んだ配列のデータを、レイアウトに応じて並べたいの。
1,
2,
3,
4,
5,
…
…
2,
3,
4,
5,
…
…
→
1, 2, 3,
4, 5, 6,
7, 8, 9,
…
…
4, 5, 6,
7, 8, 9,
…
…
(ラベル印刷みたいに並べてレイアウトするようなのをイメージしてください)
解答例
こういう書き方もあるけど……
途中にif文が入るし、3とか0とか2とか不思議な数字がいっぱい入るし……
//3つおきにdivで囲む場合 foreach ($data as $k => $v) { //1つ目の前にdiv開始タグ if ($k % 3 == 0) { echo '<div>'; } echo '<div class="label">1枚分のデータ出力</div>'; //3つ目の後ろにdiv閉じタグ if ($k % 3 == 2) { echo '</div>'; } }
そこで、こういう方法はいかが?
/** * 最初から配列を3つ単位で割って * 外のループは各行ごとのループ * 中のループは行の中の1枚ごとのループ */ $_data = array_chunk($data, 3); foreach ($_data as $_k => $_v) { echo '<div>'; foreach ($_v as $k => $v) { echo '<div class="label">1枚分のデータ出力</div>'; } echo '</div>'; }
改ページも入れるよ!1ページ5行でお願い!ということになったら、
/** * 最初から配列を3つ単位で割って * さらに5個単位で割って * 外のループは1ページごとのループ * 次のループは各行ごとのループ * 次のループは行の中の1枚ごとのループ */ $_data = array_chunk($data, 3); $_data = array_chunk($_data, 5); foreach ($_data as $k1 => $v1) { echo '<div class="page">'; foreach ($v1 as $k2 => $v2) { echo '<div class="row">'; foreach ($v2 as $k => $v) { echo '<div class="label">1枚分のデータ出力</div>'; } echo '</div>'; } echo '</div>'; }
array_chunk()で配列をさくさく切っておけば、素直にforeachの繰り返しをするだけでよい。
何が起きてるかというと、こういうスクリプトを実行してみるとわかる。
$a = range(1, 25); $b = array_chunk($a, 3); $c = array_chunk($b, 5); var_export($a); var_export($b); var_export($c);
結果
# $aがこんなので array ( 0 => 1, 1 => 2, 2 => 3, 3 => 4, 4 => 5, 5 => 6, 6 => 7, 7 => 8, 8 => 9, 9 => 10, 10 => 11, 11 => 12, 12 => 13, 13 => 14, 14 => 15, 15 => 16, 16 => 17, 17 => 18, 18 => 19, 19 => 20, 20 => 21, 21 => 22, 22 => 23, 23 => 24, 24 => 25, )
→
# $bはこうなって array ( 0 => array ( 0 => 1, 1 => 2, 2 => 3, ), 1 => array ( 0 => 4, 1 => 5, 2 => 6, ), 2 => array ( 0 => 7, 1 => 8, 2 => 9, ), 3 => array ( 0 => 10, 1 => 11, 2 => 12, ), 4 => array ( 0 => 13, 1 => 14, 2 => 15, ), 5 => array ( 0 => 16, 1 => 17, 2 => 18, ), 6 => array ( 0 => 19, 1 => 20, 2 => 21, ), 7 => array ( 0 => 22, 1 => 23, 2 => 24, ), 8 => array ( 0 => 25, ), )
→
# $cでこうなる array ( 0 => array ( 0 => array ( 0 => 1, 1 => 2, 2 => 3, ), 1 => array ( 0 => 4, 1 => 5, 2 => 6, ), 2 => array ( 0 => 7, 1 => 8, 2 => 9, ), 3 => array ( 0 => 10, 1 => 11, 2 => 12, ), 4 => array ( 0 => 13, 1 => 14, 2 => 15, ), ), 1 => array ( 0 => array ( 0 => 16, 1 => 17, 2 => 18, ), 1 => array ( 0 => 19, 1 => 20, 2 => 21, ), 2 => array ( 0 => 22, 1 => 23, 2 => 24, ), 3 => array ( 0 => 25, ), ), )
コメント