最简单的方法是多次执行 erray_reverse:首先反转整个数组,然后拆分,然后反转每个块,最后是块数组。
作为一个单行,它看起来像这样:$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);
接下来,拆分数组的其余部分:
$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);
(显然这段代码可以通过不一步一步地做所有事情来简化)
编辑: 阅读您的 cmets 到其他回复后,您可以稍微修改此方法并将其转换为 recursive 函数。通过一些代码清理,。它可能看起来像这样:
$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 个元素,并且会产生您告诉我们的内容。
Demo