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

Функция 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
        )
)
Похожие функции в PHP

Извлекает срез массива. Полезно для получения одной части, а не разбиения на множество фрагментов.

Удаляет часть массива и заменяет ее другими элементами. Модифицирует исходный массив.

Инструменты для итерации

Для последовательной обработки элементов подходят функции 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
<?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
<?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>&nbsp;</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
<?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 в запросах.

PHP array_chunk function comments

En
Array chunk Split an array into chunks