php - 使用 array_chunk 和 PHP 移动元素
问题描述
我有一个基本数组,我在其中使用 array_chunk 将它分成 3 个元素。
$array = array(
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'
);
$chunk = array_chunk($array, 3);
结果如下
[
[
"a",
"b",
"c"
],
[
"d",
"e",
"f"
],
[
"g",
"h"
]
]
(Las chunk 有 2 个元素)
如果最后一个“块”只有 2 个元素,我怎样才能向下移动第一个块的一个元素,以便第一个元素有 2 个?
它应该如下所示:
[
[
"a",
"b",
],
[
"c"
"d",
"e",
],
[
"f"
"g",
"h
]
]
(第一个块有 2 个元素)
解决方案
最简单的方法是多次执行 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);
(显然,这段代码可以通过不一步一步地做所有事情来简化)
编辑:在阅读了您对其他回复的评论后,您可以稍微修改这种方法并将其变成一个 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 个元素,并且会产生您告诉我们的内容。
推荐阅读
- python - 在python中排序的“错误”字典的零索引位置插入列名作为(“错误”,“计数”)
- java - Exoplayer 线程错误 NoSuchElementExceptionat java.util.ArrayDeque.removeFirst
- amazon-web-services - 如何自动化 aws 托管 UI 的徽标
- vba - 在报表中使用 VBA 循环根据查询字段创建多个 PDF
- java - 如何从 txt 文件 java.lang.String 中读取整数和双精度数不能转换为 int
- python - Pyspark:如何应用 pandas_udf?
- c++ - 如何从winapi中的编辑表单中获取文本?
- linux - 如何在本地环境之外的远程以 kiosk 模式运行 Ubuntu 系统
- java - 检测所有相机android
- apache-kafka - 在 Kafka Connect 中将 long 转换为 int64