我有两个要合并的数组,因此首先插入数组a的第一个x amount元素,然后再插入数组b的y amount元素,直到新数组包含两个数组中的所有元素。如果数组中的元素数不相加,则应该从数组的开头开始再次合并。
像这样的:
<?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]
我已经尝试了一些嵌套(每个)循环的复杂的解决方案,但是我非常不满意(并且未完成),所以我希望有人能用一些对我未知的数组函数来生成一些智能的东西。
最佳答案
您可以使用这对函数:
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
函数是一个辅助函数。它需要一个数组、块大小、块应该开始的偏移量以及允许使用的最大未访问元素数。最后两个参数是通过引用传递的,因为它们是由函数更新的。偏移量
$i
将增加,并且可能超出数组的大小,因此应用模(%
)将其映射到有效的数组索引。只有当索引真正在范围内(没有模)时,我们才认为它是数组元素的第一次访问,因此只有在那时$leftOver
才会减小。一旦生成一个完整的块,或者
$leftOver
变量达到0,我们就将块返回给调用方。主要功能
array_merge_interval
首先检查一些简单的边界情况,其中一个或两个大小都为零。然后它将$leftOver
变量设置为两个数组中同时存在的元素数。这将确保当所有元素至少收集一次时,进程将停止。循环为两个数组中的每一个调用helper函数,并使用
array_push
(和splash运算符)将返回的块添加到最终结果中。这将一直持续到$leftOver
达到0。