【问题标题】:while(multiple array lengths > 0)而(多个数组长度> 0)
【发布时间】:2017-08-27 00:10:33
【问题描述】:

我发现了关于我的问题的类似问题,尽管答案包含的建议只完成了我需要的一半 - 他们都没有做到。

我需要开发一个可以同时处理这两种情况的函数:

  1. 未知数量的数组,并且...
  2. 不同的长度和...
  3. 交替合并数组(添加为编辑)

我正在尝试根据我发现的两个函数编写一个函数,并相信我只需要弄清楚 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)

【问题讨论】:

  • 为什么不直接执行while (count($arrays) > 0) 并删除内部循环中/变为空的数组?
  • 嗨@Sami。感谢您表现出兴趣。 while(count($arrays) > 0) 只计算提供的数组的数量,而不是它们的长度......这是我需要的。
  • 是的,但是如果您删除内部循环中的空数组,那么最后它本身就会变为空并且您知道要停止。在此之前,它将包含您可以循环的非空数组。
  • 嗨@KIKOSoftware ...所以没有办法做到这一点?没有指向替代方法的指针?谢谢你的兴趣顺便说一句
  • 嗨@SamiKuhmonen - 哈!当然!我明白你的意思...谢谢,我会继续努力的。

标签: php arrays while-loop do-while


【解决方案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;
}

主要变化是:

  1. 您不需要使用count 来查看数组是否为空,因为空数组的计算结果为false

  2. 1234563 987654328@.

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

function alternately_merge_arrays(...$arrays) {

这样您就可以放弃func_get_args 并仍然将它与可变数量的数组一起使用。

【讨论】:

  • 看起来不错。但是 $array 应该是一个参考;否则,它将在每次运行 while 循环时被复制。 ==> foreach($arrays as $key => &$array)
  • 您好,谢谢。我复制并粘贴并运行它发送三个如上所述的数组并得到“致命错误:允许的内存大小为 268435456 字节用尽(试图分配 32 字节)”。它将$new_array[] = array_shift($array); 行识别为问题(尽管我知道这并不总是准确的)。也许这就是@jh1711 所指的?
  • 对不起,我一开始是对的,然后在自己猜测后将其编辑为错误。我只是在实际测试后将其重新编辑为正确的。
  • 谢谢大家!我刚刚花了最后几分钟把它放在我的脚本中并用实际的数组测试它——效果很好!伟大的团队合作! (我不是 5.6+,不过感谢您提供的额外信息)
【解决方案2】:

您要合并超过 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)
}

【讨论】:

  • 嗨@kiko,谢谢你。虽然我看到你做了什么,但输出并不完全是我所追求的。赞赏。尽管我没有足够的代表来显示它,但我已经向上箭头了您的答案。它说,它已注册。
【解决方案3】:

您可以使用键构建一个数组,根据这种简单的格式给出每个值的位置: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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-27
    • 2017-11-10
    • 2019-01-13
    • 2017-03-29
    • 1970-01-01
    • 2023-03-23
    • 2018-12-02
    • 1970-01-01
    相关资源
    最近更新 更多