Menu

PHPのarray_slice():配列の一部を取得する

array_slice($array, $offset, $length)は、元の配列を変えずに配列の一部のコピーを返します。末尾の要素を取る負のオフセット、preserve_keys、リストのページ分け、array_spliceとの違いを学びます。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

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_slicearray_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は配列を参照で受け取り、その部分を取り除き(必要なら置き換えの要素を挿入し)、取り除いたものを返します。

Coddyのプログラミング言語のイラスト

Coddyでコードを学ぼう

始める