如何确保在PHP的“foreach”循环中重置变量的值?

3
我正在编写一个简单的PHP页面,使用了几个foreach循环。以下是脚本:
$arrs = array("a", "b", "c");

foreach ($arrs as $arr) {
    if(substr($arr,0,1)=="b") {
        echo "This is b";
    }     
} // End of first 'foreach' loop, and I didn't use 'ifelse' here.

当这个foreach循环结束时,我写了另一个foreach循环,在其中所有foreach循环中的值都与之前的foreach循环相同。

foreach ($arrs as $arr) {
    if(substr($arr,0,1)=="c") {
        echo "This is c";
    }     
}

我不确定使用两个具有相同值和键的foreach循环是否是一个好的做法。

第一个foreach循环中的值会被覆盖吗?


2
代码缩进很糟糕,请让它更易读。 - Marcelo Cantos
我已经更改了代码缩进。 - Ben Everard
4个回答

8

在不使用引用的情况下一切正常,但是一旦使用引用,可能会出现奇怪的行为,例如:

<?php
$array = array(1,2,3,4);
//notice reference &
foreach ($array as & $item) {   }

$array2 = array(10, 11, 12, 13);
foreach ($array2 as $item) {   }

print_r($array);

输出结果为:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 13
)

由于第一个foreach将$item作为$ array [3]的引用,因此$ array [3]按顺序设置为$ array2中的每个值。在第一个foreach之后执行unset($ item)可以解决此问题,这将删除引用,但是在您的情况下,实际上这不是问题,因为您没有使用foreach引用。

哇,我遇到了和你的示例代码一模一样的问题。为什么$array[3]会依次设置$array2的每个值?为什么$item没有被更新? - alamoot

6

foreach的文档中有两个值得注意的地方:

注意:当foreach开始执行时,内部数组指针会自动重置为数组的第一个元素。这意味着您不需要在foreach循环之前调用reset()

注意:除非引用了数组,否则foreach会对指定的数组进行副本操作,而不是对数组本身进行操作。foreach对数组指针有一些副作用。 foreach期间或之后不要依赖于数组指针而不重置它


1
因为你只是从数组中读取并打印内容,而没有向数组中写入数据,所以数组中的任何值都不会改变。
但你可以通过以下方式仅循环一次来节省时间:
$arrs = array("a", "b", "c");

foreach ($arrs as $arr) {
    if(substr($arr,0,1)=="b") {
        echo "This is b";
    }
    if(substr($arr,0,1)=="c") {
        echo "This is c";
    }
}

1

你所需要的只是一个 foreach 循环。

或者更简洁的方法,就像 Jon 所说的:

$arrs = array("a", "b", "c");

foreach ($arrs as $arr)
    if ($arr != "a")
        echo 'This is ' . $arr;

这比使用 substr 要简单和快速得多,因为您已经在使用 foreach 循环。尽量不要用大量的 if 语句来污染它,如果发现自己这样做了,最好使用 switch 语句,速度更快。

干杯 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接