gpt4 book ai didi

php - 以特定间隔合并数组

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

我有两个数组想要合并,以便首先插入数组 A 的前 X 个元素,然后插入数组 B 的 Y 个元素,直到新数组包含两个数组中的所有元素。如果数组中的元素数量没有加起来,它应该再次从数组的开头开始合并。

像这样:

<?php
$arrA = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'];
$arrB = [1, 2, 3, 4];

# Print 2A 1B 2A 1B etc until no element is missing from the new array - as soon as new array contains all elements break
array_merge_interval($arrA, $arrB, 2, 1);

['A', 'B', 1, 'C', 'D', 2, 'E', 'F', 3, 'G', 'H', 4]

# Print 2B 1A 2B 1A etc until no element is missing from the new array - as soon as new array contains all elements break
array_merge_interval($arrB, $arrA, 2, 1);

[1, 2, 'A', 3, 4, 'B', 1, 2, 'C', 3, 4, 'D', 1, 2, 'E', 3, 4, 'F', 1, 2, 'G', 3, 4, 'H']

# Print 6B 0A etc until no element is missing from the new array - as soon as new array contains all elements break
array_merge_interval($arrB, $arrA, 6, 0);

[1, 2, 3, 4]

# Print 20A 3B etc until no element is missing from the new array - as soon as new array contains all elements break
array_merge_interval($arrA, $arrB, 20, 3);

['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'A', 'B', 'C', 'D', 1, 2, 3, 'E', 'F', 'G', 'H', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 4]

我已经尝试了一些带有嵌套 for(each) 循环的复杂解决方案,但我非常不满意(并且未完成),所以我希望有人可以使用一些我未知的数组函数想出一些聪明的东西?

最佳答案

你可以使用这对函数:

function array_get_chunk($a, $size, &$i, &$leftOver) {
do {
$result[] = $a[$i % count($a)];
$i++;
if ($i <= count($a)) $leftOver--;
} while ($i % $size && $leftOver);
return $result;
}

function array_merge_interval($a, $b, $sizeA, $sizeB) {
if (!$sizeA && !$sizeB) return [];
if (!$sizeA) return $b;
if (!$sizeB) return $a;

$i = $j = 0;
$result = [];
$leftOver = count($a) + count($b);
do {
array_push($result, ...array_get_chunk($a, $sizeA, $i, $leftOver));
if ($leftOver) array_push($result, ...array_get_chunk($b, $sizeB, $j, $leftOver));
} while ($leftOver);
return $result;
}

array_get_chunk 函数是一个辅助函数。它需要一个数组、 block 大小、 block 应该开始的偏移量,以及允许采用的尚未访问的元素的最大数量。

最后两个参数通过引用传递,因为它们由函数更新。偏移量 $i 将增加并可能超出数组的大小,因此应用模数 (%) 将其映射到有效的数组索引。只有当该索引确实在范围内(没有取模)时,我们才认为这是数组元素的第一次访问,因此只有那时 $leftOver 才会减少。

一旦生成了一个完整的 block ,或者 $leftOver 变量达到 0,我们就将该 block 返回给调用者。

主函数 array_merge_interval 首先检查一些简单的边界情况,其中一个或两个大小为零。然后它将 $leftOver 变量设置为两个数组中元素的数量。这将确保在所有元素至少收集一次后该过程将停止。

循环为两个数组中的每一个调用辅助函数,并使用 array_push(和 splash 运算符)将返回的 block 添加到最终结果中。这一直持续到 $leftOver 达到 0。

关于php - 以特定间隔合并数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55590348/

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