array_slice($array, $offset, $length)は、位置$offsetから始まる$length個の要素を持つ新しい配列を返します。元の配列は変わりません。$lengthを省くと、末尾まですべてを取り出します。
オフセットはキーではなく位置です(0が最初の要素)。連想配列や、キーが0, 1, 2でない配列ではこの点が重要になります。
負のオフセットで最後のN個の要素を取得する
負のオフセットは末尾から数えます。-1は最後の要素、-3は末尾から3つ目から始まります。負の長さは、末尾からその数だけ手前で止まります。
存在するより多くの要素を求めてもかまいません。array_slice($log, 0, 100)は5つすべてを返します。
preserve_keysで元のキーを保つ
4つ目の引数にtrueを渡さない限り、整数キーは0から振り直されます。文字列キーは常に保たれます。
データベースのIDのようにキーに意味があり、あとでそのキーで要素を探す場合はtrueを使います。
array_sliceで配列をページ分けする
1ページに$perPage件ずつ表示するリストの$pageページ目は、1回のスライスで取り出せます。オフセットは($page - 1) * $perPageです。この例はページのリンク付きのHTMLリストを出力します。実行してページ番号をクリックすると、リンクから$_GET['page']がセットされた状態で同じスクリプトがもう一度実行されます。
max(1, min($pages, ...))の行は、手で入力された?page=99や?page=-1を有効な範囲に収めます。データベースなら、すべての行を読み込む代わりにLIMITとOFFSETで1ページ分だけを取得しますが、すでにメモリにあるリストならarray_sliceだけで済みます。
array_sliceとarray_spliceの違い
名前は1文字違うだけですが、元の配列に対して正反対のことをします。array_sliceは一部をコピーして取り出します。array_spliceは渡した配列からその部分を切り取り、番号を振り直し、取り除いた要素を返します。切り取った場所に置き換えの要素を挿入することもできます。
array_slice | array_splice | |
|---|---|---|
| 元の配列を変える | 変えない | 変える(参照で) |
| 戻り値 | 選んだ部分 | 取り除いた部分 |
| 要素を挿入できる | できない | できる、4つ目の引数 |
| 整数キー | preserve_keysがなければ振り直す | 振り直す |
要素を削除するほかの方法は、配列から要素を削除するを参照してください。
配列をチャンクに分割する
商品を3つずつの行に並べるときのように、すべてのページを一度に必要とするなら、array_chunkが繰り返しのスライスを代わりにやってくれます。
3を2や4に変えて、もう一度実行してみてください。最後のチャンクには残ったものが入ります。
よくある質問
PHPで配列の最初のN個の要素を取得するには?
array_slice($arr, 0, 3)は最初の3つの要素を返します。配列の要素が3つより少なければ、エラーにはならずにすべてが返ります。
配列の最後のN個の要素を取得するには?
負のオフセットを使います:array_slice($arr, -3)は最後の3つの要素を返します。長さを省くと「末尾まで」の意味になります。
array_sliceのpreserve_keysは何をしますか?
デフォルトでは、array_sliceは整数キーを0から振り直します。4つ目の引数にtrueを渡す(array_slice($arr, 2, 3, true))と、元の整数キーを保ちます。文字列キーは、指定の有無にかかわらず常に保たれます。
array_sliceとarray_spliceの違いは何ですか?
array_sliceは配列の一部のコピーを返し、元の配列はそのままにします。array_spliceは配列を参照で受け取り、その部分を取り除き(必要なら置き換えの要素を挿入し)、取り除いたものを返します。