【问题标题】:Interleaving multiple arrays into a single array将多个数组交错成一个数组
【发布时间】:2009-12-07 14:59:55
【问题描述】:

我需要将几个数组合并成一个数组。描述我正在寻找的最佳方式是将数组“交错”成一个数组。

例如,从数组 #1 中取出第一项并附加到最​​终数组。从数组 #2 中获取第一项并附加到最​​终数组。从数组 #1 中获取项目 2 并追加...等。

最终的数组看起来像这样:

array#1.element#1 数组#2.element#1 . . .

“踢球者”是各个数组可以有不同的长度。

有没有更好的数据结构可以使用?

【问题讨论】:

  • 请进一步解释在数组具有不同长度的情况下您期望的结果。您会在其中一个数组到达其最后一个元素时停止交错,还是希望其余数组继续交错,直到所有数组都到达其最后一个元素?
  • 这个问题不是很清楚,因为我们没有minimal reproducible example。我们无法确定您是否正在寻求“换位”。如果是这样,规范是:Transposing multidimensional arrays in PHP

标签: php arrays


【解决方案1】:

例如,

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

【讨论】:

  • 肯定是一段很棒的代码!如果有人需要详细的分步说明此功能的工作原理,请查看this thread here :)
  • 非常简洁的解决方案
  • 请注意,array_shift 是 O(n),向上移动所有元素以填补空白,每次调用遍历整个数组。在嵌套循环中,从时间复杂度的角度来看,这很痛苦。最好使用 O(1) 的 array_push,然后在最后对结果进行一次性反转。每个数组一个计数器是另一种增加代码复杂性但高效且避免改变输入的选项。
【解决方案2】:

如果数组只有数字键,这里有一个简单的解决方案:

$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] 作为单独的数组)。

【讨论】:

    【解决方案3】:

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

    这会将这些数组相互附加,而元素只有在它们具有相同的非数字键时才会被替换。这对你来说可能不是问题,或者可能因为属性顺序而解决,因为第一个数组元素的内容将被后面的元素覆盖。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2020-07-20
        • 2021-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多