我有四个变量:$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>";
}
}