首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >推送多个数组(不同长度)的柱状值,形成平面数组

推送多个数组(不同长度)的柱状值,形成平面数组
EN

Stack Overflow用户
提问于 2015-07-13 04:15:22
回答 5查看 279关注 0票数 2

我有3到10个数组,每个数组包含20到50个值。我想将它们合并成一个单一的、平面的索引数组,但不是array_merge的工作方式。

我更希望获得第一个数组的第一个值,然后是第二个数组的第一个值,然后是第三个数组的第一个值等等。

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

实际应用程序中的值可以混合在一起,因此合并和排序不是一种选择。

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

代码语言:javascript
复制
$array1 = array('1-1', '1-2', '1-3');
$array2 = array('2-1', '2-2', '2-3', '2-4');
$array3 = array('3-1', '3-2');

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

代码语言:javascript
复制
1-1, 2-1, 3-1, 1-2, 2-2, 3-2, 1-3, 2-3, 2-4

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

代码语言:javascript
复制
$array = array($array1, $array2, $array3);
$newarray = array();
foreach ($array as $a) {
  $v = array_shift($a);
  if (isset($v)) {
    $newarray[] = $v;
  }
}
print_r($newarray);

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

代码语言:javascript
复制
Array ( [0] => 1-1 [1] => 2-1 [2] => 3-1 )

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

我很确定我需要一个函数并循环它直到所有数组都是空的,但是我就是不能把我的头绕到这个数组上。任何帮助都将不胜感激。或者如果有人知道一个本机php函数就更好了。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-07-13 05:12:22

这是一个简单的单线.

代码语言:javascript
复制
$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, ...);使用了array_mapPHP文档示例4中解释的特性,但没有对值进行任何转换(因此为null)。

所以,这会给你:

代码语言:javascript
复制
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
  }
}

然后,我们需要“扁平”数组,将所有子数组连接在一起。这是使用array_merge实现的,但不需要数组,所以我们使用call_user_func_array将数组输入到它的参数中。

然后,array_filter移除空(由array_map引入,因为原始参数不是相同的长度)。

票数 3
EN

Stack Overflow用户

发布于 2015-07-13 05:06:26

如果您正在运行PHP,您可以利用5.6+来表示函数声明和/或调用中的n个参数。实现如下所示(参考文献):

代码语言:javascript
复制
function merge_vertical(...$arrays) {
    return array_filter(array_merge(...array_map(null, ...$arrays)));
}

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

输出:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-07-13 04:56:02

试试这段代码

代码语言:javascript
复制
$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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31375323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档