1. ホーム
  2. PHP

【PHP】array_chunk・array_fill・array_pad の使い方|配列の分割・生成・穴埋め

Share

PHP で配列を扱っていると、「一定件数ごとに区切って表示したい」「決まった長さの配列をまとめて用意したい」「要素数が足りないぶんを埋めたい」といった場面がよく出てきます。こうした処理を自前の for ループで書くこともできますが、標準関数を使えば一行で済みます。この記事では array_chunkarray_fillarray_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 に何個ずつ区切るかを指定します。まずは基本の例です。

array_chunk.php
<?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_keystrue を渡します。連想配列を分割するときや、何番目の要素だったかを保持したいときに役立ちます。

preserve_keys.php
<?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個ずつに区切っておけば、あとは二重ループで行と列を出力するだけで済みます。

grid.php
<?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個分ほしい」といったときに、ループを書かずに一発で用意できます。

array_fill.php
<?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引数の $count0 を渡すと空の配列が返り、負の数を渡すと PHP 8.0 以降は ValueError になります(それより前のバージョンでは警告)。基本的に個数は 1 以上を渡すと覚えておけば問題ありません。

キーを自分で指定したいときは array_fill_keys

array_fill は数値キーの連番しか作れません。「特定の文字列キーをまとめて同じ初期値にしたい」場合は、姉妹関数の array_fill_keys が便利です。第1引数にキーの配列、第2引数に初期値を渡します。集計用のカウンターを用意するときによく使います。

array_fill_keys.php
<?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) です。すでに指定サイズ以上ある場合は何もせず、元の配列をそのまま返します。元の配列を書き換えるのではなく、埋めた結果を戻り値として返す点に注意してください。

array_pad.php
<?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引数に負の数を渡すと配列の先頭側(左)を埋めることです。数値の桁揃えや、右寄せで表示したいときに使えます。負の数を渡した場合、その絶対値が目的の長さになります。

pad_left.php
<?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列そろった表になります。

grid_padded.php
<?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_chunkarray_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_chunkarray_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つを押さえておくと、表示前の配列整形がぐっと楽になります。

参考ページ