gpt4 book ai didi

php - 在 PHP 中使用 array_chunk 移动元素

转载 作者:可可西里 更新时间:2023-11-01 00:39:07 26 4
gpt4 key购买 nike

我有一个基本数组,我在其中使用 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 block 有 2 个元素)

如果最后一个“ block ”只有 2 个元素,我怎样才能将第一个 block 的元素向下移动以便第一个元素有 2 个?

它应该是这样的:

[
[
"a",
"b",
],
[
"c"
"d",
"e",
],
[
"f"
"g",
"h
]
]

(第一个 block 有 2 个元素)

最佳答案

最简单的方法是多次执行 erray_reverse:首先反转整个数组,然后拆分,然后反转每个 block ,最后反转 block 数组。

作为单行代码,它看起来像这样:$chunk = array_reverse(array_map('array_reverse', array_chunk(array_reverse($array), 3)));

但是请注意,反转数组是一项昂贵的操作,因此如果您的数组实际上比您的示例中的要大,则不推荐使用这种方法。


更有效但代码也更多:使用模数计算第一个 block 中需要的元素数:$first_chunk_size = count($array) % 3;

接下来,如果数组大小是 block 大小的倍数,为避免出现空数组,如果模数为 0,则更正 block 大小:$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);

然后将第一个 block 和其他 block 组合成一个数组: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 将产生您告诉我们的结果。

Demo

关于php - 在 PHP 中使用 array_chunk 移动元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53449942/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com