在PHP中从下一个foreach项目中拉取元素?

zbwhf8kr  于 2023-05-16  发布在  PHP
关注(0)|答案(8)|浏览(237)

我正在为我的网站做一个PHP“交通灯”风格的警告系统,基本上是说“如果当前数组条目和下一个条目之间有X百分比的变化,就会抛出错误”。
所以,我在foreach循环中循环我的数组元素,但是需要能够做这样的事情:(注:这只是一个基本的例子,但应该足以得到的想法)

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

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

我使用了next()标记来获取下一个值,但要知道这只适用于数组。有没有别的东西我可以用来得到下一个foreach项目?
谢谢你的时间!

3lxsmp7m

3lxsmp7m1#

用另一种方法来做,存储前一个条目并比较它们。

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

jchrr9hc2#

答案很简单:不要使用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;
    }
}
ykejflvf

ykejflvf3#

您应该能够用途:

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

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

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

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

wfauudbj

wfauudbj4#

最简单的方法就是改变你的心态。不检查当前记录和下一个记录,而是检查上一个记录和当前记录。记住上一个比记住下一个更容易。
如果你不想这样,你也可以抛弃foreach,使用for和一个计数器变量进行C风格的迭代--但有一点需要注意:PHP的稀疏数组可能会让您吃不消,因此最好在迭代之前对检查过的数组调用array_values()

ddarikpa

ddarikpa5#

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

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

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

koaltpgm

koaltpgm6#

为什么不使用普通的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;
    }
?>
ca1c2owp

ca1c2owp7#

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

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

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

    $lastValue = $a['value'];
}
6jygbczu

6jygbczu8#

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;
        }

相关问题