Самый простой способ - это многократное выполнение erray_reverse: сначала инвертировать весь массив, затем разделить, затем инвертировать каждый кусок, а затем, наконец, массив фрагментов.
Как однострочник, он выглядит какthis: $chunk = array_reverse(array_map('array_reverse', array_chunk(array_reverse($array), 3)));
Имейте в виду, однако, что обращение к массиву является дорогостоящей операцией, поэтому, если ваш массив является более точным, чем в вашем примере, это не рекомендуется.
Более эффективный, но также и более сложный код: Рассчитать количество элементов, которые должны быть в первом чанке, по модулю: $first_chunk_size = count($array) % 3;
Далее, чтобы избежать пустого массива, если размер массива кратен размеру чанка, исправьтеразмер куска, если по модулю выдает 0: $first_chunk_size = $first_chunk_size == 0 ? 3 : $first_chunk_size;
, затем обрежьте первую часть: $first_chunk = array_slice($array, 0, $first_chunk_size);
next, разделите остальную часть массива: $chunks = array_chunk(array_slice($array,$first_chunk_size),3);
затем объедините первый блок и другие блоки в один массив: array_unshift($chunks, $first_chunk);
Полный код второго подхода:
$array = [
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'
];
$first_chunk_size = count($array) % 3;
$first_chunk_size = $first_chunk_size == 0 ? 3 : $first_chunk_size;
$first_chunk = array_slice($array, 0, $first_chunk_size);
$chunks = array_chunk(array_slice($array,$first_chunk_size),3);
array_unshift($chunks, $first_chunk);
var_dump($chunks);
(очевидно, этот код можно упростить, если не делать всешаг за шагом)
РЕДАКТИРОВАТЬ: Прочитав ваши комментарии к другим ответам, вы можете немного изменить этот подход и превратить его в функцию повторного получения.С некоторой очисткой кода.это может выглядеть так:
$array = [
'a', 'b', 'c', 'd', 'e', 'f', 'g'
];
function custom_array_chunk ($array) {
$first_chunk_size = count($array) % 3;
if ($first_chunk_size == 0) {
$chunks = array_chunk($array, 3);
} else {
$chunks = custom_array_chunk(array_slice($array,2));
array_unshift($chunks, array_slice($array, 0, 2));
}
return $chunks;
}
var_dump(custom_array_chunk($array));
Это сработает для обоих случаев, 1 и 2 элемента «остались» и даст именно то, что вы нам сказали.
Демо