【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,
),
),
)