最简单的方法是多次执行array_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);
(显然,这段代码可以通过不逐步执行每个步骤来简化)
编辑:看了你对其他回复的评论,你可以稍微修改这种方法并将其转换为递归函数。经过一些代码清理后,它可能如下所示:
$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个元素的情况,并且将产生与您所述完全相同的结果。
演示
$chunk_elements
,因为count($array) % 3
将会返回你所需要的。 - cmbuckley