PHP跟踪最后的x次迭代


PHP keep track of the last x iterations

我有四个变量:$one_flag$two_flag$three_flag$four_flag。我在for循环中使用它们作为标志,因为我想跟踪最后四次迭代。

$one_flag = 1;
$two_flag = 0;
$three_flag = 0;
$four_flag = 0;
$a = array(1, 2, 3, 17, 27, 44, 45, 47, 49);
foreach ($a as $v) {
    if ($one_flag){
        $first_v = $v;
        $one_flag = 0;
        $two_flag = 1;
    }
    if ($two_flag){
        $second_v = $v;
        $two_flag = 0;
        $three_flag = 1;
    }
    if ($three_flag){
        $third_v = $v;
        $three_flag = 0;
        $four_flag = 1;
    }
    if ($four_flag){
        $fourth_v = $v;
        $four_flag = 0;
        $first_flag = 1;
    }
    if ($v == 45){
        # tricky part
        print "The last three v's were: " . $first_v . ", " . $second_v . ", " . $third_v . "'n";
    }
}

现在它打印The last three v's were 1, 1, 1,但应该打印The last three v's were 45, 44, 27。此外,上面代码的问题是,我需要知道哪个标志等于1(我们当前使用的标志),以便打印正确的语句。

例如,当$v == 45时,假定$first_v等于27;假定CCD_ 10等于44;假定CCD_ 11等于17;并且假定CCD_ 12等于45。我需要知道$three_flag等于1,才能按顺序打印出"后三个是$second_flag、$first_flag和$thurd_flag"。

我怎样才能让我的循环工作?如何跟踪最后四次迭代?

编辑:我说错了。我实际上想打印The last three v's were 44, 27, 17

我认为这是一个最小的例子,实际程序更复杂。否则,您可以只获取数组的长度,并根据它检索最后3个元素

我会改变方法如下:

$f1 = -1;  // Last value read
$f2 = -1;  // second to last value
$f3 = -1;

$a = array(1, 2, 3, 17, 27, 44, 45, 47, 49);
foreach ($a as $v) {
    $f3 = $f2;
    $f2 = $f1;
    $f1 = $v;
    if ($v == 45){
        # tricky part
        print "The last three v's were: " . $f1 . ", " . $f2 . ", " . $f3 . "'n";
    }
}

我使用-1作为一个指标,表示变量没有赋值。如果需要的话,你应该根据自己的情况进行调整。

问题在于if语句。

//loop sets $v = 1
//this one is true due to initial parameters, execute
if ($one_flag){
    $first_v = $v; //$first_v = 1
    $one_flag = 0;
    $two_flag = 1; //$two_flag is now TRUE!!!
}
//$two_flag is true, execute immediately!
if ($two_flag){
    $second_v = $v; //$second_v = 1
    $two_flag = 0;
    $three_flag = 1;
}

尽管在我的阅读中,这应该会导致印刷品给出The last three v's were 45, 45, 45。如果你想继续这样做,你需要使用else if

$a = array(1, 2, 3, 17, 27, 44, 45, 47, 49);
$track = array();
$num = 3;
foreach ($a as $v){
    $track[] = $v;
    if (count($track) > $num){
        $track = array_slice($track, 1);
    }
    if ($v == 45){
        print_r(array_reverse($track));
    }
}

结果

Array
(
    [0] => 45
    [1] => 44
    [2] => 27
)

了解您试图解决的问题会有所帮助,但我会立即使用圆形数组来跟踪最后四个问题。(根据您的修订版编辑):

$a = array(1, 2, 3, 17, 27, 44, 45, 47, 49);
$previous = array ();
$pCounter = 0;
foreach ($a as $i => $v) {
    if (45 === $v) {
        print_r(array_reverse($previous));
    }
    // track the last three using a circular array
    $previous[$pCounter] = $v;
    $pCounter = ($pCounter + 1) % 3;
}

结果:

Array
(
    [0] => 44
    [1] => 27
    [2] => 17
)

在线试用。

而不是如果使用elseif,它将达到您的目的,并将变量名$first_flag更改为$one_flag

    $one_flag = 1;
    $two_flag = 0;
    $three_flag = 0;
    $four_flag = 0;
    $probe_counter = 1;
     $first_v=0;
     $second_v=0;
     $third_v=0;$fourth_v=0;
    $a = array(1, 2, 3, 17, 27, 44, 45, 47, 49);
    foreach ($a as $key => $val) {
        if ($one_flag){
            $first_v = $val;
            $one_flag = 0;
            $two_flag = 1;
        }
        elseif ($two_flag){
            $second_v = $val;
            $two_flag = 0;
            $three_flag = 1;
        }
        elseif ($three_flag){
            $third_v = $val;
            $three_flag = 0;
            $four_flag = 1;
        }
        elseif ($four_flag){
            $fourth_v = $val;
            $four_flag = 0;
            $one_flag = 1;
        }
        if ($val == 45){
            # tricky part
            echo "The last three v's were: " . $first_v . ", " . $second_v . ", " . $third_v . "<br>";
        }
    }