Array slice: примеры (PHP)

Функция array_slice для извлечения частей массива в PHP
Раздел: Работа с массивами
array_slice(array $array, int $offset, ?int $length = null, bool $preserve_keys = false): array
Основные сведения о функции array_slice

Функция array_slice() извлекает часть массива, начиная с указанного смещения. Эта операция часто используется для пагинации, ограничения выборки данных или выделения фрагмента из большого набора элементов.

Функция применяется, когда требуется получить срез массива без изменения оригинальной структуры данных. Она возвращает новый массив, содержащий выбранные элементы.

Аргументы функции

Синтаксис: array_slice(array $array, int $offset, ?int $length = null, bool $preserve_keys = false): array

  • $array – исходный массив для обработки.
  • $offset – начальная позиция. Если значение положительное, отсчет начинается с начала массива. Отрицательное значение указывает на смещение от конца массива.
  • $length – количество извлекаемых элементов. Если параметр не указан, функция вернет все элементы от позиции $offset до конца массива. Отрицательное значение исключит указанное количество элементов с конца.
  • $preserve_keys – флаг сохранения ключей. По умолчанию false, что означает переиндексацию числовых ключей. При значении true оригинальные ключи сохраняются.
Базовые примеры применения
Извлечение с положительным смещением
$array = ['a', 'b', 'c', 'd', 'e'];
$result = array_slice($array, 2);
print_r($result);
Array
(
    [0] => c
    [1] => d
    [2] => e
)
Указание длины среза
$array = ['a', 'b', 'c', 'd', 'e'];
$result = array_slice($array, 1, 3);
print_r($result);
Array
(
    [0] => b
    [1] => c
    [2] => d
)
Отрицательное смещение
$array = ['a', 'b', 'c', 'd', 'e'];
$result = array_slice($array, -2);
print_r($result);
Array
(
    [0] => d
    [1] => e
)
Отрицательная длина
$array = ['a', 'b', 'c', 'd', 'e'];
$result = array_slice($array, 1, -1);
print_r($result);
Array
(
    [0] => b
    [1] => c
    [2] => d
)
Сохранение ключей
$array = [2 => 'a', 5 => 'b', 8 => 'c', 10 => 'd'];
$result = array_slice($array, 1, 2, true);
print_r($result);
Array
(
    [5] => b
    [8] => c
)
Похожие функции в PHP
  • array_splice() – извлекает часть массива и при этом удаляет её из исходного массива, позволяя также заменять извлеченные элементы другими значениями. Используется, когда требуется модификация оригинального массива.
  • array_chunk() – разбивает массив на части заданного размера, возвращая многомерный массив из этих фрагментов. Полезен для разделения данных на блоки.
  • iterator_to_array() в сочетании с LimitIterator – объектно-ориентированный подход для работы с итераторами, предоставляющий больше контроля над процессом, особенно с большими наборами данных.

array_slice() предпочтительнее, когда требуется просто получить копию части массива без его изменения.

Аналоги в других языках программирования

Array slice в Python

Используется синтаксис срезов: list[start:stop:step]. Работает с любыми последовательностями.

arr = ['a', 'b', 'c', 'd', 'e']
result = arr[1:4]
print(result)
['b', 'c', 'd']

Array slice в Javascript

Метод Array.prototype.slice(). Синтаксис и поведение очень похожи на PHP.

let arr = ['a', 'b', 'c', 'd', 'e'];
let result = arr.slice(1, 4);
console.log(result);
['b', 'c', 'd']

Array slice в MySQL

Прямого аналога для массивов нет, так как это СУБД. Для ограничения выборки строк используется конструкция LIMIT offset, count.

SELECT * FROM table_name LIMIT 5, 10;
(возвращает 10 строк, начиная с 6-й)
Распространенные ошибки
Смещение за пределами массива

Если смещение превышает размер массива, функция возвращает пустой массив.

$array = ['a', 'b'];
$result = array_slice($array, 5);
print_r($result);
Array
(
)
Ожидание сохранения ключей по умолчанию

Часто забывают, что числовые ключи переиндексируются, если не установлен флаг $preserve_keys.

$array = [10 => 'a', 20 => 'b'];
$result = array_slice($array, 0, 1);
print_r($result);
Array
(
    [0] => a // Ключ 10 утерян
)
Неправильная интерпретация отрицательной длины

Отрицательная длина исключает элементы с конца ожидаемого среза.

$array = ['a', 'b', 'c', 'd', 'e'];
$result = array_slice($array, 1, -2); // Берем с индекса 1, но исключаем 2 последних элемента от конца
print_r($result);
Array
(
    [0] => b
    [1] => c // 'd' и 'e' исключены
)
Изменения в новых версиях PHP

В PHP 8.0 параметр $length стал необязательным (?int $length = null), что формализует его поведение при значении null (возврат всех элементов до конца). В более ранних версиях он также был необязательным, но тип не был объявлен явно как nullable.

До PHP 5.0.2 параметр $preserve_keys не мог использоваться с ассоциативными массивами, что теперь исправлено.

Расширенные примеры использования
Пагинация данных
Пример php
$allItems = range(1, 100);
$page = 3;
$itemsPerPage = 10;
$offset = ($page - 1) * $itemsPerPage;
$pageItems = array_slice($allItems, $offset, $itemsPerPage);
print_r($pageItems);
Array
(
    [0] => 21
    [1] => 22
    ... // до 30
)
Извлечение последних N элементов с сохранением структуры
Пример php
$logEntries = [
    '2024-01-10' => 'Error A',
    '2024-01-11' => 'Warning B',
    '2024-01-12' => 'Info C',
    '2024-01-13' => 'Error D'
];
$recentLogs = array_slice($logEntries, -2, 2, true);
print_r($recentLogs);
Array
(
    [2024-01-12] => Info C
    [2024-01-13] => Error D
)
Имитация взятия подстроки для массива символов
Пример php
$strArray = str_split('Hello, World!');
$worldArray = array_slice($strArray, 7, 5);
$worldStr = implode('', $worldArray);
echo $worldStr;
World
Комбинирование с array_map для обработки среза
Пример php
$numbers = [1, 2, 3, 4, 5, 6];
$squaredSlice = array_map(function($n) { return $n * $n; }, array_slice($numbers, 2, 3));
print_r($squaredSlice);
Array
(
    [0] => 9
    [1] => 16
    [2] => 25
)
Работа с массивами объектов
Пример php
class Item { public function __construct(public $id) {} }
$objects = [new Item(1), new Item(2), new Item(3), new Item(4)];
$slice = array_slice($objects, 1, 2);
foreach($slice as $obj) echo $obj->id . ' ';
2 3

PHP array_slice function comments

En
Array slice Extract a slice of the array