【问题标题】:Pull elements from next foreach item in PHP?从 PHP 中的下一个 foreach 项目中提取元素?
【发布时间】:2011-06-13 05:29:38
【问题描述】:

我正在为我的网站做一个 PHP '红绿灯'风格的警告系统,它基本上说'如果当前数组条目和下一个数组条目之间有 X 百分比变化,则抛出错误'。

所以,我在 foreach 循环中遍历我的数组元素,但是需要能够执行以下操作:(注意:这只是一个基本示例,但应该足以理解)

foreach($array as $a)
{
$thisValue = $a['value'];
$nextValue = next($a['value']);

$percentageDiff = ($nextValue-$thisValue)/$thisValue;
}

我已经放置了 next() 标签来获取下一个值,但我知道这仅适用于数组。还有什么我可以用来获取下一个 foreach 项目的东西吗?

感谢您的宝贵时间!

【问题讨论】:

  • 感谢您的回复 - 所有这些似乎都是完成这项工作的好方法。我选择了@Orbling 和@contagious 提供的解决方案——虽然它确实会导致非常多的开销,但考虑到函数被调用的频率,我可以忍受。

标签: php loops foreach element next


【解决方案1】:

换一种方式,存储前一个条目并比较它们。

$prev = null;
foreach ($item as $i){
    if ($prev !== null){
        diff($prev, $i);
    }
    $prev = $i
}

【讨论】:

  • 我投了赞成票,这就是我要做的。 (但请检查您的括号!)
  • 我认为这个解决方案有不必要的开销;)
  • 干杯!从来没有想过要使用以前的记录...该死的我觉得很愚蠢! :p
【解决方案2】:

简单的答案:不要使用foreach 循环。改用简单的for 循环:

for ($i = 0; $i < count($array); $i++) {
    if (isset($array[$i + 1])) {
        $thisValue = $array[$i]['value'];
        $nextValue = $array[$i + 1]['value'];

        $percentageDiff = ($nextValue-$thisValue)/$thisValue;
    }
}

【讨论】:

  • 这不适用于字典和哈希表等关联数组,对吧?
【解决方案3】:

你应该可以使用:

foreach($array as $a)
{
    $array_copy = $array;
    $thisValue = $a['value'];

    $nextValue = next($array_copy);
    $nextValue = $nextValue['value'];

    $percentageDiff = ($nextValue-$thisValue)/$thisValue;
}

这会复制数组,然后将指针移动 1。

【讨论】:

    【解决方案4】:

    IMO 最简单的解决方案是改变你的心态。不是检查当前记录和下一个记录,而是检查上一个和当前记录。记住前一个比记住下一个更容易。

    如果您不希望这样,您也可以放弃 foreach 并使用 for 和计数器变量迭代 C 样式 - 不过需要注意的是:PHP 的稀疏数组可能会咬你,所以你最好打电话给 @987654323 @ 在被检查的数组上进行迭代。

    【讨论】:

      【解决方案5】:

      如果您想使用foreach,您可以将当前值与上一个值而不是下一个值进行比较:

      $previous = null;
      foreach ($array as $a) {
          if (!is_null($previous)) {
              $thisValue = $previous['value'];
              $nextValue = $a['value'];
              $percentageDiff = ($nextValue-$thisValue)/$thisValue;
          }
          $previous = $a;
      }
      

      这样,您只需将整个迭代移动一项。

      【讨论】:

        【解决方案6】:

        为什么不使用普通的 for 循环而不是 foreach 迭代器?

        <?php
            $testArray = array(10,20,30,40,50,60,70,80,90,100);
        
            $elementCount = count($testArray);
            for($loop=0; $loop<$elementCount; $loop++) {
        
                $thisValue = $testArray[$loop];
        
                // Check if there *is* a next element.
                $nextValue = $loop + 1 < $elementCount ? $testArray[$loop + 1] : null;
        
                // Calculate the percentage difference if we have a next value.
                if($nextValue) $percentageDiff = ($nextValue-$thisValue)/$thisValue;
            }
        ?>
        

        【讨论】:

        • 这不适用于字典和哈希表等关联数组,对吧?
        • @Brandon 您必须提取 array_keys 并使用该实例中的那些进行迭代。
        • @Brandon 顺便说一句,我只是概述了一个潜在的路线,这(以及迄今为止的所有其他路线)显然不是可用的实现,因为它们每次都高兴地踩在“百分比差异”上迭代。 :-)
        • @middparka 我想你明白这一点,评论更多是针对原始海报的。对其他人来说可能不那么明显。
        • @Brandon 这么认为。但是,@contagious 使用 foreach 迭代器的答案要优雅得多,所以我怀疑任何眼睛都会掉到这么低的位置。无论如何,很高兴阐明这些事情,这就是说。 :-)
        【解决方案7】:

        '通常使用前一个值比使用下一个值更容易:

        $lastValue = NULL;
        foreach ($array as $a) {
            if ($lastValue === NULL) {
                $lastValue = $a['value'];
                continue;
            }
        
            $percentageDiff = ($a['value'] - $lastValue) / $lastValue;
        
            $lastValue = $a['value'];
        }
        

        【讨论】:

        • 以前的值会起作用——实际上它会变得更容易......不知道为什么我没有想到:)
        【解决方案8】:
        for($i=0;$i<count($array);$i++) {
        $thisValue = $array[$i];
        $nextValue = $array[i+1]; // will not be set if $i==count($array)-1
        $percentageDiff = ($nextValue-$thisValue)/$thisValue;
        }
        

        确实有array iterator 函数支持您需要的功能,并且使用 next() / prev() 等简单地循环遍历数组也可以正常工作,但上面的解决方案更优雅

        它不适用于 foreach,因为 foreach 会创建引用的副本,并且不会在数组本身中设置数组指针。

        这是一个可用于使用数组迭代器函数的关联数组的示例:

        $arrayobject = new ArrayObject($array);
        $iterator = $arrayobject->getIterator();
        
                for($i=0;$i<count($array);$i++) {
                   $iterator->seek($i);
                   $thisValue = $iterator->current();
                   $iterator->seek($i+1);
                   $nextValue = $iterator->current(); 
                   $percentageDiff = ($nextValue-$thisValue)/$thisValue;
                }
        

        【讨论】:

        • 这不适用于字典和哈希表等关联数组,对吧?
        • 没错,这就是为什么我链接了非常适合的数组迭代器函数。另一种可能性是记住最后一个数组元素并根据它进行计算并将输出移动一个条目 - 我在答案中添加了一个示例代码
        猜你喜欢
        • 1970-01-01
        • 2011-07-03
        • 2021-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多