[英]Move elements using array_chunk with 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;
第一个块中需要的元素数量: $first_chunk_size = count($array) % 3;
接下来,如果数组大小是块大小的倍数,为了避免空数组,如果模数为0,则更正块大小: $first_chunk_size = $first_chunk_size == 0 ? 3 : $first_chunk_size;
$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);
(显然,这个代码可以通过不逐步完成所有操作来简化)
编辑:读完您对其他回复的评论后,您可以稍微修改此方法并将其转换为recusrive功能。 通过一些代码清理, 它可能看起来像这样:
$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元素“遗留”并将完全产生你告诉我们的内容。
您可以先使用array_reverse反转数组,然后使用array_chunk 。 然后反转内部数组,并再次反转外部数组:
$array = array(
'a',
'b',
'c',
'd',
'e',
'f',
'g',
'h'
);
$array = array_reverse($array);
$chunk = array_chunk($array, 3);
$array = array_map('array_reverse', $chunk);
print_r(array_reverse($array));
结果
Array
(
[0] => Array
(
[0] => a
[1] => b
)
[1] => Array
(
[0] => c
[1] => d
[2] => e
)
[2] => Array
(
[0] => f
[1] => g
[2] => h
)
)
从功能上讲,多重array_reverse方法是可以理解的:
$chunk = array_reverse(array_map('array_reverse', array_chunk(array_reverse($array), 3)));
但是,它非常昂贵,特别是对于较大的阵列。 另一种方法是将元素从数组末尾切片并将它们添加到您的chunked数组中:
$size = 3;
$chunk = array();
while (count($array) > 0) {
array_unshift($chunk, array_slice($array, -$size));
$array = array_slice($array, 0, -$size);
}
这对于您的阵列来说大约快20倍(超过10万次迭代),对于包含600多个项目的阵列来说大约快1000倍。
您可以将空数据预先添加到您的数组中,类似于array_chunk符合您的需要。
然后删除这些前置数据。
$chunk = 3;
$nbToPrepend = ($chunk - count($array) % $chunk);
$prepend = array_fill(0, $nbToPrepend, null);
$result = array_chunk(array_merge($prepend, $array), $chunk);
$result[0] = array_slice($result[0], $nbToPrepend);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.