5

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

所以,我在 foreach 循环中遍历我的数组元素,但是需要能够做这样的事情:(注意:这只是一个基本示例,但应该足以理解这个想法)

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

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

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

谢谢你的时间!

4

8 回答 8

10

以另一种方式进行,并存储上一个条目并进行比较。

$prev = null;
foreach ($item as $i){
    if ($prev !== null){
        diff($prev, $i);
    }
    $prev = $i
}
于 2011-01-21T15:30:24.017 回答
4

简单的答案:不要使用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;
    }
}
于 2011-01-21T15:30:05.513 回答
1

您应该能够使用:

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

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

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

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

于 2011-01-21T15:30:23.580 回答
1

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

如果你不想这样,你也可以放弃foreach和迭代 C 风格的使用for和一个计数器变量——不过需要注意的是:PHP 的稀疏数组可能会咬你,所以你最好array_values()在迭代之前调用检查过的数组。

于 2011-01-21T15:30:24.093 回答
1

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

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

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

于 2011-01-21T15:31:37.417 回答
1

为什么不只使用普通的 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;
    }
?>
于 2011-01-21T15:32:21.753 回答
1

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

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

    $percentageDiff = ($a['value'] - $lastValue) / $lastValue;

    $lastValue = $a['value'];
}
于 2011-01-21T15:32:47.347 回答
1
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;
}

确实有支持您需要的数组迭代器函数,并且还可以使用 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;
        }
于 2011-01-21T15:33:11.130 回答