将多个数组交错合并成一个数组

9
我需要将几个数组合并成一个数组。最好的描述方式是将这些数组“交错”到一个数组中。
例如,从数组#1获取第一个项目并附加到最终数组中。从数组#2获取第一个项目并附加到最终数组中。获取数组#1的第二个项目并附加...等等。
最终的数组可能看起来像这样:
array#1.element#1 array#2.element#1 . . .
关键是,单独的数组长度可以不同。
是否有更好的数据结构可用?

2
请进一步解释一下,当数组长度不同时,您希望结果的情况。当其中一个数组达到最后一个元素时,您会停止交错吗?还是要继续交替剩余的数组,直到所有数组都达到其最后一个元素? - Oskar
1
这个问题不是非常清晰,因为我们没有提供 [mcve]。我们无法确定您是否正在寻找“转置”。如果是这样,规范的方法是:在PHP中转置多维数组 - mickmackusa
4个回答

31
例如,
function array_zip_merge() {
  $output = array();
  // The loop incrementer takes each array out of the loop as it gets emptied by array_shift().
  for ($args = func_get_args(); count($args); $args = array_filter($args)) {
    // &$arg allows array_shift() to change the original.
    foreach ($args as &$arg) {
      $output[] = array_shift($arg);
    }
  }
  return $output;
}

// test

$a = range(1, 10);
$b = range('a', 'f');
$c = range('A', 'B');
echo implode('', array_zip_merge($a, $b, $c)); // prints 1aA2bB3c4d5e6f78910

这段代码确实很棒!如果有人需要详细的逐步解释这个函数是如何工作的,请查看这里的帖子 :) - Acidon
请注意,array_shift 的时间复杂度为 O(n),每次调用都需要移动所有元素以填补空隙,遍历整个数组。在嵌套循环中,从时间复杂度的角度来看,这是痛苦的。最好使用 array_push,它的时间复杂度为 O(1),然后在最后一步进行一次独立的反转结果。对于每个数组一个计数器是另一种选择,它增加了代码复杂性,但是高效并避免了对输入进行改变。 - ggorlen

3
如果数组只有数字键,这里有一个简单的解决方案:
$longest = max( count($arr1), count($arr2) );
$final = array();

for ( $i = 0; $i < $longest; $i++ )
{
    if ( isset( $arr1[$i] ) )
        $final[] = $arr1[$i];
    if ( isset( $arr2[$i] ) )
        $final[] = $arr2[$i];
}

如果您有命名键,则可以为每个数组使用array_keys函数,并循环遍历键的数组。
如果您想要超过两个数组(或可变数量的数组),那么您可能能够使用嵌套循环(尽管我认为您需要将$arr[0]$arr[1]作为单独的数组)。

1

我会使用array_merge(),但这显然取决于你具体要做什么。

这将把这些数组附加到彼此,而只有当它们具有相同的非数字键时,元素才会被替换。这对你可能不是问题,或者可能可以通过属性顺序来解决,因为后面的数组元素将覆盖先前的元素。


0
如果您有n个数组,可以使用SortedList,并使用arrayIndex * n + arrayNumber作为排序索引。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接