PHPで配列を扱う際、特定の範囲のデータだけを取り出したい場面は非常に多く存在します。
例えば、ページネーションの実装や、最新の投稿データを数件だけ表示したい場合など、配列の切り出しは必須のテクニックです。
PHPには配列の一部を抽出するための標準関数としてarray_sliceが用意されています。
本記事では、array_slice関数の基本的な使い方から、実務で役立つ応用的な活用例まで詳しく紹介します。
関数の引数の仕様や、元の配列に影響を与えない非破壊的な特性についても深く掘り下げていきましょう。
array_slice関数の基本的な使い方
array_slice関数は、配列から指定した範囲の要素を取り出し、新しい配列として返す関数です。
まずは、この関数の基本的な構文を確認してみましょう。
array_slice(array $array, int $offset, ?int $length = null, bool $preserve_keys = false): array
この関数には最大で4つの引数を渡すことができますが、多くの場合、最初の2つか3つの引数を利用します。
第1引数:対象となる配列
第1引数には、切り出しを行いたい元の配列を指定します。
この関数は元の配列を直接書き換えることはありません。
抽出された結果は戻り値として返されるため、破壊的な操作を避けたい場合に非常に便利です。
第2引数:オフセット(開始位置)
第2引数の$offsetは、抽出を開始する位置を指定する数値です。
数値が0の場合は配列の先頭から、正の数の場合はそのインデックスから開始されます。
もし負の値を指定した場合は、配列の末尾から数えた位置から抽出が始まります。
第3引数:長さ(抽出する要素数)
第3引数の$lengthは、取り出したい要素の個数を指定します。
この引数を省略した場合は、指定したオフセットから配列の最後までがすべて取得されます。
正の値を指定するとその個数分だけ取得し、負の値を指定すると「末尾から数えて何個手前まで取得するか」という意味になります。
第4引数:キーの保持
第4引数の$preserve_keysは、配列のインデックス(キー)を維持するかどうかを制御します。
デフォルトはfalseであり、数値添字配列の場合はインデックスが0から振り直されます。
連想配列のキーをそのまま維持したい場合や、数値のIDを保持したい場合にはtrueを指定してください。
具体的なコード例で学ぶ抽出パターン
それでは、実際のコードを用いて、引数の組み合わせによる挙動の違いを見ていきましょう。
// サンプルとなる配列の定義
$fruits = ['apple', 'banana', 'cherry', 'date', 'elderberry'];
// 1. インデックス2から最後まで取得
$result1 = array_slice($fruits, 2);
// 2. インデックス1から2つの要素を取得
$result2 = array_slice($fruits, 1, 2);
// 3. 末尾から2つだけ取得
$result3 = array_slice($fruits, -2);
// 結果の出力
print_r($result1);
print_r($result2);
print_r($result3);
// 結果1
Array
(
[0] => cherry
[1] => date
[2] => elderberry
)
// 結果2
Array
(
[0] => banana
[1] => cherry
)
// 結果3
Array
(
[0] => date
[1] => elderberry
)
実行結果を見ると、第4引数を指定していないため、インデックスが0から再割り当てされていることがわかります。
次に、キーを保持する場合の挙動を確認しましょう。
$input = [10 => 'A', 20 => 'B', 30 => 'C', 40 => 'D'];
// キーを保持しない(デフォルト)
$no_preserve = array_slice($input, 1, 2);
// キーを保持する
$preserve = array_slice($input, 1, 2, true);
print_r($no_preserve);
print_r($preserve);
// キーを保持しない場合
Array
(
[0] => B
[1] => C
)
// キーを保持する場合
Array
(
[20] => B
[30] => C
)
このように、データの識別子としてインデックスを利用している場合は、第4引数にtrueを渡すことが重要です。
引数の組み合わせによる動作まとめ
$offsetと$lengthの正負の組み合わせにより、抽出範囲は柔軟に変化します。
主要な組み合わせを以下の表にまとめました。
| 引数の状態 | 動作内容 |
|---|---|
| offset が正 | 先頭から指定位置までスキップして開始 |
| offset が負 | 末尾から指定した距離だけ戻った位置から開始 |
| length が正 | 開始位置から指定された個数分を取得 |
| length が負 | 開始位置から「末尾からn個手前」までを取得 |
| length が null | 開始位置から配列の最後までをすべて取得 |
array_sliceの効率的な活用シーン
この関数をどのような場面で活用すべきか、代表的なケースを2つ紹介します。
1. ページネーション(データ分割)
Webアプリケーションで100件のデータを10件ずつ表示するようなページネーションを実装する際、array_sliceは非常に強力です。
SQLでLIMIT句を使わず、すべてのデータを取得した後にPHP側で制御する場合に有効です。
$all_data = range(1, 50); // 1から50までの配列
$current_page = 3;
$per_page = 10;
$offset = ($current_page - 1) * $per_page;
$paged_data = array_slice($all_data, $offset, $per_page);
print_r($paged_data);
この計算式を用いることで、現在のページに応じた適切な範囲のデータを抽出できます。
2. 最新情報のピックアップ
「最新の5件のみを表示する」といった処理では、配列をソートした後にarray_sliceを適用します。
末尾から取得したい場合は、オフセットに負の値を指定するだけで済みます。
$logs = ['log1', 'log2', 'log3', 'log4', 'log5', 'log6', 'log7'];
// 最新の3件を取得
$latest_logs = array_slice($logs, -3);
コードが非常にシンプルになり、可読性が向上するのが大きなメリットです。
array_sliceとarray_spliceの違い
よく似た名前にarray_spliceがありますが、これらは全く異なる挙動をします。
array_sliceは元の配列を変更せず、切り出した一部をコピーとして返します。
一方でarray_spliceは、元の配列を直接変更し、指定範囲を取り除いたり置換したりします。
データを単純に参照・抽出したいだけであれば、必ずarray_sliceを選択するようにしてください。
元のデータを保護しながら操作することは、バグの少ないプログラミングにおいて非常に重要です。
連想配列での注意点
array_sliceは連想配列(文字列キーを持つ配列)に対しても使用可能です。
連想配列の場合、キーは文字列であるため、第4引数に関わらずキーは常に維持されます。
しかし、数値のような文字列キー(”100″など)が混在している場合は、第4引数の設定によって挙動が変わる可能性があるため注意が必要です。
意図しないキーの振り直しを防ぐために、キーを保持したい場合は明示的にtrueを指定する習慣をつけておくと安全です。
まとめ
PHPのarray_slice関数は、配列操作の中でも非常に汎用性が高く、かつ安全に使用できる関数です。
オフセットや長さの指定に負の値を活用することで、複雑な条件分岐を書くことなくスマートに要素を抽出できます。
また、「非破壊的な関数である」という特徴を理解しておくことで、元のデータを汚さずに処理を組み立てることが可能です。
日々の開発において、データのフィルタリングや表示範囲の制御が必要になった際は、ぜひ今回紹介したテクニックを役立ててください。
配列操作のマスターは、PHPプログラミングの効率を大きく向上させる第一歩となります。
