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

时间:2015-07-13 04:15:22

标签: php arrays array-merge

我有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功能。

5 个答案:

答案 0 :(得分:3)

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

$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的功能,但没有对值进行任何转换(因此,null)。

所以,这会给你:

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
  }
}

然后,我们需要&#34;压扁&#34;数组,将所有子数组连接在一起。 这是使用array_merge实现的,但这并不是一个数组,因此我们使用call_user_func_array将数组提供给它的参数。

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

答案 1 :(得分:2)

刚刚添加以供参考,如果您运行的是PHP 5.6+,则可以利用the new ... operator在函数声明和/或调用中表示 n 个参数。实现将是这样的(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
)

答案 2 :(得分:1)

试试此代码

$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);

答案 3 :(得分:1)

我建议在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);

答案 4 :(得分:-2)

您可以使用+运算符。

joshua
祝你好运!