PHP で配列を扱っていると、「一定件数ごとに区切って表示したい」「決まった長さの配列をまとめて用意したい」「要素数が足りないぶんを埋めたい」といった場面がよく出てきます。こうした処理を自前の for ループで書くこともできますが、標準関数を使えば一行で済みます。この記事では array_chunk・array_fill・array_pad の 3 つを取り上げ、それぞれの引数の意味と、実際のコードでの使いどころを解説します。PHP を書き始めて配列操作に慣れてきた初心者〜中級者の方を対象にしています。
目次
3つの関数はそれぞれ何をするのか
名前が似ていて混同しがちですが、役割ははっきり分かれています。ざっくり言うと、array_chunk は「1つの配列を小さな配列に分割する」、array_fill は「同じ値で埋めた配列を新しく生成する」、array_pad は「既存の配列を指定した長さになるまで埋める」関数です。まず全体像を表で押さえておきましょう。
| 関数 | やること | 戻り値 |
|---|---|---|
array_chunk() | 配列を指定した個数ごとに分割する | 分割後の配列を要素に持つ二次元配列 |
array_fill() | 同じ値を並べた配列を新規に作る | 生成された配列 |
array_pad() | 配列を指定サイズまで値で埋める | 埋めたあとの配列(元の配列は変更しない) |
いずれも元の配列を書き換えるのではなく、結果を新しい配列として返す関数です。戻り値を変数で受け取って使う点は共通しています。ここからは1つずつ見ていきます。
array_chunk で配列を一定数ごとに区切る
array_chunk は、1つの配列を「N個ずつ」の小さな配列に切り分けます。書式は array_chunk(array $array, int $length, bool $preserve_keys = false) です。第2引数の $length に何個ずつ区切るかを指定します。まずは基本の例です。
<?php
$fruits = ['りんご', 'みかん', 'ぶどう', 'いちご', 'もも'];
// 2個ずつに分割する
$chunks = array_chunk($fruits, 2);
print_r($chunks);
/*
Array
(
[0] => Array ( [0] => りんご [1] => みかん )
[1] => Array ( [0] => ぶどう [1] => いちご )
[2] => Array ( [0] => もも )
)
*/
5個の要素を2個ずつに区切ったので、最後の塊は1個だけになりました。要素数が割り切れない場合、余った要素は最後の塊にそのまま入ります。エラーにはなりません。
第3引数 preserve_keys で元のキーを残す
デフォルトでは、分割後の各配列のキーは 0 から振り直されます。元の配列でのキー(インデックス)をそのまま保持したいときは、第3引数 $preserve_keys に true を渡します。連想配列を分割するときや、何番目の要素だったかを保持したいときに役立ちます。
<?php
$items = ['a', 'b', 'c', 'd', 'e'];
// true を渡すと元のキー(0,1,2...)を維持する
$chunks = array_chunk($items, 2, true);
print_r($chunks);
/*
Array
(
[0] => Array ( [0] => a [1] => b )
[1] => Array ( [2] => c [3] => d ) // キーが 2,3 のまま
[2] => Array ( [4] => e )
)
*/
true を指定しなかった1つ目の例では、2番目の塊のキーが 0, 1 に振り直されていました。true を指定すると 2, 3 という元の位置が保たれます。この違いを理解しておくと、意図しないキーのずれを防げます。
グリッド表示に使う
array_chunk の代表的な用途が、一覧を「1行3列」のようなグリッドやテーブルの行に分けて表示する処理です。あらかじめ配列を3個ずつに区切っておけば、あとは二重ループで行と列を出力するだけで済みます。
<?php
$products = ['商品A', '商品B', '商品C', '商品D', '商品E', '商品F', '商品G'];
// 3個ずつ = 1行3列のグリッドにする
$rows = array_chunk($products, 3);
echo '<table>';
foreach ($rows as $row) {
echo '<tr>';
foreach ($row as $product) {
echo '<td>' . htmlspecialchars($product) . '</td>';
}
echo '</tr>';
}
echo '</table>';
商品が7件なので、最後の行だけ1列(商品G)になります。表示崩れが気になる場合は、後述の array_pad で行の要素数を揃える方法と組み合わせると、常に3列そろったきれいな表を作れます。
array_fill で同じ値の配列を作る
array_fill は、指定した値を指定した個数だけ並べた配列を新しく作ります。書式は array_fill(int $start_index, int $count, mixed $value) です。「0で初期化された配列を10個分ほしい」といったときに、ループを書かずに一発で用意できます。
<?php
// 開始キー 0 から、値 0 を 5 個並べる
$counters = array_fill(0, 5, 0);
print_r($counters);
/*
Array ( [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 )
*/
// 開始キーを 5 にすると、そこから連番でキーが振られる
$slots = array_fill(5, 3, 'empty');
print_r($slots);
/*
Array ( [5] => empty [6] => empty [7] => empty )
*/
第1引数の $start_index は、最初の要素に付けるキー(数値)です。ここを 5 にすると、キーが 5, 6, 7 と連番で振られます。第2引数の $count に 0 を渡すと空の配列が返り、負の数を渡すと PHP 8.0 以降は ValueError になります(それより前のバージョンでは警告)。基本的に個数は 1 以上を渡すと覚えておけば問題ありません。
キーを自分で指定したいときは array_fill_keys
array_fill は数値キーの連番しか作れません。「特定の文字列キーをまとめて同じ初期値にしたい」場合は、姉妹関数の array_fill_keys が便利です。第1引数にキーの配列、第2引数に初期値を渡します。集計用のカウンターを用意するときによく使います。
<?php
$categories = ['tech', 'life', 'news'];
// 各カテゴリの件数カウンターを 0 で初期化
$count = array_fill_keys($categories, 0);
print_r($count);
/*
Array ( [tech] => 0 [life] => 0 [news] => 0 )
*/
// あとはカウントアップしていくだけ
$count['tech']++;
$count['tech']++;
$count['news']++;
print_r($count);
// Array ( [tech] => 2 [life] => 0 [news] => 1 )
先にすべてのキーを 0 で用意しておくと、「そのキーがまだ存在するか」を isset でチェックせずにいきなり ++ できます。未定義キーへのアクセスによる警告を避けられるのが利点です。
array_pad で配列の長さを揃える
array_pad は、配列を指定したサイズになるまで値で埋めます。書式は array_pad(array $array, int $length, mixed $value) です。すでに指定サイズ以上ある場合は何もせず、元の配列をそのまま返します。元の配列を書き換えるのではなく、埋めた結果を戻り値として返す点に注意してください。
<?php
$data = [1, 2, 3];
// 長さ 5 になるまで末尾を 0 で埋める
$padded = array_pad($data, 5, 0);
print_r($padded);
/*
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 0 [4] => 0 )
*/
// すでに 5 個以上あるなら、そのまま返る(切り詰めはされない)
$already = array_pad([1, 2, 3, 4, 5], 3, 0);
print_r($already); // Array ( [0] => 1 ... [4] => 5 )
第2引数の $length は「最終的にしたい要素数」であって、「追加する個数」ではありません。ここを間違えると意図した長さになりません。また、指定サイズより元の配列が長くても、array_pad は要素を削りません。長さの調整(切り詰め)が必要なら array_slice を別途使います。
length を負の数にすると先頭を埋める
array_pad のユニークな点は、第2引数に負の数を渡すと配列の先頭側(左)を埋めることです。数値の桁揃えや、右寄せで表示したいときに使えます。負の数を渡した場合、その絶対値が目的の長さになります。
<?php
$data = [1, 2, 3];
// 長さ 5、負の数なので「先頭」を 0 で埋める
$padded = array_pad($data, -5, 0);
print_r($padded);
/*
Array ( [0] => 0 [1] => 0 [2] => 1 [3] => 2 [4] => 3 )
*/
正の数なら末尾、負の数なら先頭に埋められる、と覚えておきましょう。なお埋められた要素も含めてキーは 0 から振り直されます。
グリッドの空きマスを揃える
先ほどの array_chunk のグリッド表示で「最後の行だけ列が足りない」問題を、array_pad で解決してみます。分割した各行を array_pad で3要素に揃えれば、足りないマスは空文字で埋まり、常に3列そろった表になります。
<?php
$products = ['商品A', '商品B', '商品C', '商品D', '商品E', '商品F', '商品G'];
$cols = 3;
$rows = array_chunk($products, $cols);
echo '<table>';
foreach ($rows as $row) {
// 各行を必ず 3 要素にする(足りない分は空文字)
$row = array_pad($row, $cols, '');
echo '<tr>';
foreach ($row as $cell) {
echo '<td>' . htmlspecialchars($cell) . '</td>';
}
echo '</tr>';
}
echo '</table>';
これで商品Gの行にも空のセルが2つ補われ、すべての行が3列になります。array_chunk と array_pad は、このように組み合わせて使う場面が多い関数です。
意図した結果にならないときに確認したいこと
array_pad の長さが変わらない
「array_pad したのに要素が増えない」というときは、第2引数に追加したい個数を渡しているケースがほとんどです。第2引数は「最終的な要素数」です。3要素の配列に2個足したいなら、2 ではなく 5 を渡します。また、元の配列がすでに指定サイズ以上のときは変化しないので、その点も確認してください。
戻り値を受け取り忘れている
3つとも「元の配列を書き換える」関数ではなく「結果を返す」関数です。array_pad($data, 5, 0); のように呼び出しただけで $data が変わることを期待していると、いつまでも変化しません。必ず $data = array_pad($data, 5, 0); のように戻り値を受け取ってください。array_chunk や array_fill も同様です。
array_chunk の length に 0 以下を渡した
array_chunk の第2引数 $length は 1 以上でなければなりません。0 や負の数を渡すと、PHP 8.0 以降は ValueError が発生します。分割数を変数から計算して渡す場合は、その値が 1 以上になっているかを事前に確認しておくと安全です。
まとめ
配列の分割・生成・穴埋めをおさらいします。array_chunk は配列を N 個ずつの塊に分割し、第3引数 true で元のキーを保持できます。グリッドやページ送りの実装で活躍します。array_fill は同じ値で埋めた配列を新規に生成し、初期値のそろったカウンター配列などをループなしで用意できます。文字列キーで作りたいときは array_fill_keys を使います。array_pad は配列を指定サイズまで埋める関数で、正の数なら末尾、負の数なら先頭に値を追加します。いずれも元の配列は書き換えず結果を返すので、戻り値を受け取ることを忘れないようにしましょう。この3つを押さえておくと、表示前の配列整形がぐっと楽になります。