SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【php】array_chunk()は便利だよ

問題

フラットに並んだ配列のデータを、レイアウトに応じて並べたいの。

1,
2,
3,
4,
5,

 → 
1, 2, 3,
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,
    ),
  ),
)


関連するメモ

コメント