Array chunk: примеры (PHP)
array_chunk(array $array, int $length, bool $preserve_keys = false): arrayФункция array_chunk() в PHP разделяет массив на несколько частей заданного размера. Она применяется для обработки больших наборов данных порциями, создания сеток элементов на веб-страницах или подготовки данных для пакетной обработки.
array (обязательный): Исходный массив для разделения.
length (обязательный): Целое положительное число, указывающее размер каждого фрагмента.
preserve_keys (необязательный): Логическое значение. При значении true ключи исходного массива сохраняются. По умолчанию false — фрагменты индексируются с нуля.
Создание фрагментов без сохранения ключей.
<?php
$array = ['a', 'b', 'c', 'd', 'e'];
$result = array_chunk($array, 2);
print_r($result);Array
(
[0] => Array
(
[0] => a
[1] => b
)
[1] => Array
(
[0] => c
[1] => d
)
[2] => Array
(
[0] => e
)
)<?php
$array = [5 => 'a', 6 => 'b', 7 => 'c'];
$result = array_chunk($array, 2, true);
print_r($result);Array
(
[0] => Array
(
[5] => a
[6] => b
)
[1] => Array
(
[7] => c
)
)Извлекает срез массива. Полезно для получения одной части, а не разбиения на множество фрагментов.
Удаляет часть массива и заменяет ее другими элементами. Модифицирует исходный массив.
Для последовательной обработки элементов подходят функции array_map или цикл foreach. Функция array_chunk предпочтительнее при необходимости физического разделения на группы фиксированного размера.
<?php
$array = [1, 2, 3];
$result = array_chunk($array, 0);Warning: array_chunk(): Size parameter expected to be greater than 0
<?php
$result = array_chunk('строка', 2);Warning: array_chunk() expects parameter 1 to be array, string given
Если не установить третий аргумент в true, ассоциативные ключи будут сброшены в результирующих фрагментах.
В PHP 8.0 поведение функции было ужесточено. При передаче отрицательного значения параметра length теперь выбрасывается исключение ValueError, а не выдается предупреждение с возвратом null. Это соответствует общей тенденции языка к строгой типизации.
<?php // PHP 8+
$array = [1, 2, 3];
$result = array_chunk($array, -1);ValueError: array_chunk(): Argument #2 ($length) must be greater than 0
Пакетная отправка записей в базу данных.
<?php
$users = range(1, 100); // 100 пользователей
$chunks = array_chunk($users, 10);
foreach ($chunks as $batch) {
// Предполагаемый запрос:
// $db->query('INSERT INTO logs (user_id) VALUES ' . implode(',', $batch));
echo 'Отправлена партия из ' . count($batch) . ' пользователей.\n';
}Отправлена партия из 10 пользователей. Отправлена партия из 10 пользователей. ... (всего 10 раз)
Размещение элементов в строки таблицы.
<?php
$items = ['Товар A', 'Товар B', 'Товар C', 'Товар D', 'Товар E'];
$rows = array_chunk($items, 3);
foreach ($rows as $row) {
echo '<tr>';
foreach ($row as $cell) {
echo '<td>' . htmlspecialchars($cell) . '</td>';
}
// Заполнение пустых ячеек, если в последней строке меньше элементов
$emptyCells = 3 - count($row);
for ($i = 0; $i < $emptyCells; $i++) {
echo '<td> </td>';
}
echo '</tr>';
}<tr><td>Товар A</td><td>Товар B</td><td>Товар C</td></tr> <tr><td>Товар D</td><td>Товар E</td><td> </td></tr>
<?php
$data = ['a' => 1, 'b' => 2, 'c' => 3, 'd' => 4];
$chunks = array_chunk($data, 2, true);
print_r($chunks);Array
(
[0] => Array
(
[a] => 1
[b] => 2
)
[1] => Array
(
[c] => 3
[d] => 4
)
)Array chunk в Python
Используется list comprehension или функция more_itertools.batched (с Python 3.12).
# Python 3.12+
def batched(iterable, n):
it = iter(iterable)
while batch := tuple(itertools.islice(it, n)):
yield batch
# Пример с более старой версией:
def chunk(lst, n):
for i in range(0, len(lst), n):
yield lst[i:i + n]
list(chunk([1, 2, 3, 4, 5], 2))[[1, 2], [3, 4], [5]]
Array chunk в Javascript
Стандартной функции нет, реализуется вручную.
function chunkArray(arr, size) {
const chunks = [];
for (let i = 0; i < arr.length; i += size) {
chunks.push(arr.slice(i, i + size));
}
return chunks;
}
chunkArray([1, 2, 3, 4, 5], 2);[[1, 2], [3, 4], [5]]
Array chunk в MySQL
Прямого аналога нет. Разбиение логически выполняется с помощью LIMIT и OFFSET в запросах.