合并多个数组而不是合并它们

Combine multiple arrays not by merging them

我有 3 到 10 个数组,每个数组包含 20 到 50 个值。 我想将它们合并到一个数组中,但不是 array_merge 的工作方式。 我宁愿取第一个数组的第一个值,然后是第二个数组的第一个值,然后是第三个数组的第一个值,依此类推。

键在这里不是问题,它可以是数字或关联数组,我只是保留值,而不是原始键。

实际应用中的值可以混合,因此不能在之后进行合并和排序。


所以如果我有 3 个这样的数组:

$array1=array('1-1','1-2','1-3');
$array2=array('2-1','2-2','2-3','2-4');
$array3=array('3-1','3-2');

我需要结果是一个包含以下顺序值的数组:

1-1, 2-1, 3-1, 1-2, 2-2, 3-2, 1-3, 2-3, 2-4


到目前为止,我有这段代码:

$array=array($array1,$array2,$array3);
$newarray=array();
foreach($array as $a){
  $v=array_shift($a);
  if(isset($v)){
    $newarray[]=$v;
  }
}
print_r($newarray);

但是,当然,它只运行第一组值并给我:

Array ( [0] => 1-1 [1] => 2-1 [2] => 3-1 )


array_shift 是我在这里需要的,因为它从旧数组中删除了值(我不再需要它了)并将它移动到新数组(如果它 isset)。参见:http://php.net/manual/en/function.array-shift.php

我很确定我需要一个函数并循环它直到所有数组都为空,但我就是无法理解这个函数。任何帮助将不胜感激。如果有人知道执行此操作的本机 php 函数,甚至更好。

您可以使用 + 运算符。

$c = $a + $b

祝你好运!

试试这个代码

$array1=array('1-1','1-2','1-3');
$array2=array('2-1','2-2','2-3','2-4');
$array3=array('3-1','3-2');

$array=array($array1,$array2,$array3);
$array2 = $array ;

function cmp($a, $b){
    return (count($b) - count($a));
}
usort($array2, 'cmp');

$xax_length = count($array2[0]);

$newarray=array();
for($i=0;$i<$xax_length;$i++) {

   foreach($array as &$a){
      $v=array_shift($a);
      if(isset($v)){
        $newarray[]=$v;
      }
   }
}
print_r($newarray);

我建议在 for 循环中散列所有数组。

$array1=array('1-1','1-2','1-3');
$array2=array('2-1','2-2','2-3','2-4','2-5');
$array3=array('3-1','3-2');

$maxSize=max(count($array1),count($array2),count($array3));

$array=array($array1,$array2,$array3);

$newarray=array();

for ($i = 0; $i < $maxSize; $i++) {
  for ($x = 0; $x < count($array); $x++) {
    if(count($array[$x]) > $i){
      $newarray[] = $array[$x][$i];
    }
  }
}
print_r($newarray);

仅供参考,如果你是运行 PHP 5.6+,你可以利用the new ... operator to signify n number of arguments in a function declaration and/or call. Implementation would be something like this (reference):

function merge_vertical(...$arrays) {
    return array_filter(array_merge(...array_map(null, ...$arrays)));
}

print_r(merge_vertical($array1, $array2, $array3));

Output:

Array
(
    [0] => 1-1
    [1] => 2-1
    [2] => 3-1
    [3] => 1-2
    [4] => 2-2
    [5] => 3-2
    [6] => 1-3
    [7] => 2-3
    [10] => 2-4
)

这是一个简单的单行...

$arr1 = ['1-1', '1-2', '1-3'];
$arr2 = ['2-1', '2-2', '2-3', '2-4'];
$arr3 = ['3-1', '3-2'];

$result = array_filter(call_user_func_array(array_merge, array_map(null, $arr1, $arr2, $arr3)));

所以,也许不是那么简单...一些解释。

array_map(null, ...); 利用 PHP docs 示例 4 中解释的 array_map 的特性,但没有对值进行任何转换(因此为空)。

所以,这会给你:

array(4) {
  [0]=>
  array(3) {
    [0]=>
    string(3) "1-1"
    [1]=>
    string(3) "2-1"
    [2]=>
    string(3) "3-1"
  }
  [1]=>
  array(3) {
    [0]=>
    string(3) "1-2"
    [1]=>
    string(3) "2-2"
    [2]=>
    string(3) "3-2"
  }
  [2]=>
  array(3) {
    [0]=>
    string(3) "1-3"
    [1]=>
    string(3) "2-3"
    [2]=>
    NULL
  }
  [3]=>
  array(3) {
    [0]=>
    NULL
    [1]=>
    string(3) "2-4"
    [2]=>
    NULL
  }
}

然后,我们需要 "flatten" 数组,将所有子数组连接在一起。 这是使用 array_merge 实现的,但它不接受数组,因此我们使用 call_user_func_array 将数组提供给它的参数。

然后 array_filter 删除空值(由 array_map 引入,因为原始参数长度不同)。