Array slice: примеры (PHP)
array_slice(array $array, int $offset, ?int $length = null, bool $preserve_keys = false): arrayФункция 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
)- 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 8.0 параметр $length стал необязательным (?int $length = null), что формализует его поведение при значении null (возврат всех элементов до конца). В более ранних версиях он также был необязательным, но тип не был объявлен явно как nullable.
До PHP 5.0.2 параметр $preserve_keys не мог использоваться с ассоциативными массивами, что теперь исправлено.
$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
)$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
)$strArray = str_split('Hello, World!');
$worldArray = array_slice($strArray, 7, 5);
$worldStr = implode('', $worldArray);
echo $worldStr;World
$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
)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