【问题标题】:Foreach loop for an Array [duplicate]数组的foreach循环[重复]
【发布时间】:2021-12-20 03:48:08
【问题描述】:

请问,foreach 如何从数组中的第二个数字开始循环。

$num = array("20","40","89","300","190","15");
$new = 0;
foreach ($num as $val) {
   $new = $val;
  echo "Value: $new\n";
}

预期结果是
价值:40 价值:89 价值:300 价值:190 价值:15
得到的是
价值:20 价值:40 价值:89 价值:300 价值:190 价值:15

【问题讨论】:

  • 你真的期待你在问题中写下的结果吗?请澄清。

标签: php arrays sorting arraylist


【解决方案1】:

只需将$val$num 数组的第一个元素(在本例中为$num[0])进行比较即可忽略它。

$num = array("20","40","89","300","190","15");

foreach ($num as $val) {
  if ($val==$num[0]) continue;
  echo "Value: $val\n";
}

或者使用布尔标志:

$num = array("20","40","89","300","190","15");
$ignoreFirst=true;
foreach ($num as $val) {
  if ($ignoreFirst) {$ignoreFirst=false;continue;}
  echo "Value: $val\n";
}

【讨论】:

  • 仅供参考:比较弱,可能会产生不同的结果。但是0 是索引,foreach 也提供它。只要引入它,你的解决方案就稳定了(在一般意义上已经是正确的了)
  • @hakre; $val 已经与 $num 的定义相同。
  • 是的,在这种情况下它不会咬人,但它有两种方式可以:a)在数组中重复,b)弱比较会识别为重复。对于给出的特定数组,答案是正确的,这里的$val == $num[0] 表示$num 将只是第一个数组值:$index === 0。做索引检查只是更便携,也许更好地阅读和维护。这不应该说你的答案是错误的,这只是对它的评论。
  • @hakre;骗子的好点,我会尽量记住它!我在考虑每个键都是唯一的关联数组。
  • 是的,很好发现:如果数组没有标准的零索引起始键(因为它们可以是 PHP 中的映射),我的 $index === 0 检查根本不稳定。并且 array_key_first() 特别适合这种跳过过滤条件。
【解决方案2】:

另一种解决方案(使用循环,索引从 1 开始而不是 0):

<?php
$num = array("20","40","89","300","190","15");

$index=1;
while ($index < count($num)) {
  echo " Value:". $num[$index] ;
  $index++;
}

?>

因此,如果您想从数组中的第三个数字开始,请在第二行更改为$index=2

【讨论】:

    【解决方案3】:

    有几种方法可以处理它,例如您可以取消设置数组中的第一个元素,然后对其进行迭代,但您也可以应用一个产生除第一个参数之外的所有参数并将数组作为参数传递的函数:

    $num = ["20", "40", "89", "300", "190", "15"];
    $new = 0;
    $dropFirst = static fn ($_, string ...$a) => yield from $a;
    foreach ($dropFirst(...$num) as $val) {
        $new = $val;
        echo "Value: $new\n";
    }
    

    我会说这取决于foreach 而不是$variable 的当前需求。

    上面的$dropFirst 是一个快速、实用的Iterator(以Generator 子类型的形式),可以很容易地替换为其他更详细的内容。

    例如您可以将数组包装在ArrayIterator 中,然后使用LimitIterator

    $num = ["20", "40", "89", "300", "190", "15"];
    $iterator = new LimitIterator(
        new ArrayIterator($num),
        1
    );
    
    $new = 0;
    foreach ($iterator as $val) {
        $new = $val;
        echo "Value: $new\n";
    }
    

    这当然是更多的代码行,但是您可以将限制迭代与完成的点(foreach)分开,仍然只传递一个变量(也称为控制反转)。


    相反,您也可以将控件放入foreach 正文中,然后跳过第一个元素。例如一个简单的索引检查:

    $num = ["20", "40", "89", "300", "190", "15"];
    
    $new = 0;
    foreach ($num as $index => $val) {
        if (0 === $index) {
            continue;
        }
        $new = $val;
        echo "Value: $new\n";
    }
    

    因此,即使所有这些示例都有效 - 以及其他答案中的示例 - 您仍然需要考虑在您的情况下您想要控制的位置:

    1. 更改原始数据(重新定义)
    2. 更改 foreach'ed 的内容(代表)
    3. 更改foreach 正文(现在)

    【讨论】:

      【解决方案4】:

      array_​shift() 将“将一个元素移出数组的开头

      <?php
      $num = array("20","40","89","300","190","15");
      $new = 0;
      array_shift($num);
      foreach ($num as $val) {
          $new = $val;
          echo "Value: $new\n";
      }
      

      将输出:

      Value: 40
      Value: 89
      Value: 300
      Value: 190
      Value: 15
      

      【讨论】:

        猜你喜欢
        • 2020-10-31
        • 2021-07-15
        • 2021-05-30
        • 2017-11-18
        • 2020-10-13
        • 1970-01-01
        • 2013-07-10
        • 2019-01-20
        • 1970-01-01
        相关资源
        最近更新 更多