while(多个数组长度> 0)

时间:2017-04-01 21:50:04

标签: php arrays while-loop do-while

我发现了关于我的问题的类似问题,尽管答案中包含了我所需要的一半的建议 - 没有一个能完成所有这些。

我需要开发一个能够应对两者的功能:

  1. 未知数量的数组,AND ...
  2. 不同长度和......
  3. 交替合并数组(添加为编辑)
  4. 我正在尝试根据我发现的两个函数编写一个函数,并且相信我只需要想出while(),但我完全难过了。我似乎无法追踪在他们的条件下使用数组的while循环的任何例子......如果你跟随。

    function alternately_merge_arrays() {
      $arrays = func_get_args();
      $new_array = array();
      //
    
      while( count($array) in $arrays is > 0  ) {
    
      //
        foreach($arrays as $array) {
          if ( count($array) > 0 )
             $new_array[] = array_shift($array);
         }
      }
     return $new_array;
    }
    
    var_dump(alternately_merge_arrays(array(1,4), array(2,5,7), array(3,6,8,9));
    

    当然我可能完全错了,它需要的不是while()循环。我很酷地使用for()和foreach(),但是如果第一个数组是最短的,那么这些会停止循环,而while()应该继续...

    编辑:我需要的输出是:

    array(1,2,3,4,5,6,7,8,9)
    

3 个答案:

答案 0 :(得分:1)

我会像这样重写它:

10

关键变化是:

  1. 您不需要仅使用function alternately_merge_arrays() { $arrays = func_get_args(); $new_array = []; while ($arrays) { foreach ($arrays as $key => &$array) { $item = array_shift($array); if ($item) { $new_array[] = $item; } else { unset($arrays[$key]); } } } return $new_array; } 来查看数组是否为空,因为空数组将计算为count

  2. 如果您使用引用(false),则&$array将直接影响相关数组,因此如果已清空,则可以从array_shift中删除每个数组删除带有$arrays

  3. 的元素后

    如果您使用的是PHP 5.6+,那么您可以利用variable length argument lists(可变函数)并使用:

    array_shift

    所以你可以放弃function alternately_merge_arrays(...$arrays) { 并仍然使用可变数量的数组。

答案 1 :(得分:0)

您想要合并2个以上的数组吗?有很多方法可以做到这一点。这看起来有点像你的意图。

<?php

function alternately_merge_arrays() {
  $arguments = func_get_args();
  $result    = [];
  foreach($arguments as $argument) {
    if (is_array($argument)) $result = array_merge($result,$argument);
                        else echo "ERROR: argument is not an array.";
  }
  return $result;
}

var_dump(alternately_merge_arrays(array(1,4), array(2,5,7), array(3,6,8,9)));

输出结果为:

array(9) {
  [0]=> int(1)
  [1]=> int(4)
  [2]=> int(2)
  [3]=> int(5)
  [4]=> int(7)
  [5]=> int(3)
  [6]=> int(6)
  [7]=> int(8)
  [8]=> int(9)
}

答案 2 :(得分:0)

您可以构建一个带有键的数组,这些键根据这种简单的格式给出每个值的位置:column#raw。然后你要做的就是按键排序并返回值:

function alternately_merge_arrays() {
    $result = [];
    foreach(func_get_args() as $n => &$array) {
        foreach ($array as $k => &$v) {
            $result["$k#$n"] = $v;
        }
    }
    ksort($result);
    return array_values($result);
}