array_slice($array, $offset, $length) retorna um novo array com $length elementos a partir da posição $offset. O array original não é alterado. Deixe de fora $length para pegar tudo até o fim.
O offset é uma posição (0 é o primeiro elemento), não uma chave. Isso importa para arrays associativos e para arrays cujas chaves não são 0, 1, 2.
Pegar os N últimos elementos com um offset negativo
Um offset negativo conta a partir do fim: -1 é o último elemento, -3 começa três antes do fim. Um tamanho negativo para essa quantidade de elementos antes do fim.
Pedir mais elementos do que existem não tem problema: array_slice($log, 0, 100) retorna os cinco.
Manter as chaves originais com preserve_keys
As chaves inteiras são renumeradas a partir de 0, a menos que você passe true como quarto argumento. Chaves string sempre são mantidas.
Use true quando as chaves significam algo, como ids do banco de dados, e você vai procurar elementos por elas depois.
Paginar um array com array_slice
Mostrar a página $page de uma lista com $perPage itens por página é um único slice: o offset é ($page - 1) * $perPage. Este exemplo imprime uma lista HTML com links de página. Rode e clique num número de página: o mesmo script roda de novo com $_GET['page'] definido pelo link.
A linha max(1, min($pages, ...)) mantém um ?page=99 ou ?page=-1 digitado à mão dentro do intervalo válido. Com um banco de dados, você pediria só uma página com LIMIT e OFFSET em vez de carregar todas as linhas, mas para uma lista que já está na memória, o array_slice faz o trabalho inteiro.
array_slice ou array_splice
Os nomes diferem por uma letra e eles fazem coisas opostas com o original. O array_slice copia uma parte. O array_splice corta a parte do array que você passa, renumera e retorna os elementos removidos. Ele também pode inserir substitutos onde foi o corte.
array_slice | array_splice | |
|---|---|---|
| Altera o original | não | sim (por referência) |
| Retorna | a parte selecionada | a parte removida |
| Pode inserir elementos | não | sim, quarto argumento |
| Chaves inteiras | renumeradas, a menos que use preserve_keys | renumeradas |
Para mais jeitos de apagar elementos, veja remover elementos de um array.
Dividir um array em pedaços
Quando você precisa de todas as páginas de uma vez, por exemplo para dispor produtos em linhas de três, o array_chunk faz os slices repetidos para você.
Mude o 3 para 2 ou 4 e rode de novo. O último pedaço guarda o que sobrar.
Perguntas frequentes
Como pego os N primeiros elementos de um array no PHP?
array_slice($arr, 0, 3) retorna os três primeiros elementos. Se o array tiver menos de três, você recebe todos e nenhum erro.
Como pego os N últimos elementos de um array?
Use um offset negativo: array_slice($arr, -3) retorna os três últimos elementos. Deixar de fora o tamanho significa "até o fim".
O que faz o preserve_keys no array_slice?
Por padrão, o array_slice renumera as chaves inteiras a partir de 0. Passe true como quarto argumento, array_slice($arr, 2, 3, true), para manter as chaves inteiras originais. Chaves string sempre são mantidas, com ou sem ele.
Qual a diferença entre array_slice e array_splice?
O array_slice retorna uma cópia de parte do array e não mexe no original. O array_splice recebe o array por referência, remove aquela parte dele (opcionalmente inserindo substitutos) e retorna o que removeu.