假设我得到了以下代码:
$arr = array("1" => 1, "2" => 2, "3" => 3, "4" => "4", "5" => "5");
foreach($arr as $key => $value) {
echo "Array[".$key."]: " . $arr[$key] . "<br>";
echo "Value: " . $value . "<br>";
if (isset($arr[$key+1])) $arr[$key+1] = $arr[$key+1]*2;
}
它创建了这个输出:
Array[1]: 1
Value: 1
Array[2]: 4
Value: 2
Array[3]: 6
Value: 3
Array[4]: 8
Value: 4
Array[5]: 10
Value: 5
现在我的问题是,为什么$value在遍历所述数组时与$arr[$key]不同?$value是否因为foreach只是在处理数组的副本或其他什么而没有随数组更新?我可以在不在循环中使用$arr[$key]的情况下解决这个问题吗?
据我所知,PHP使用"写时复制",所以在你尝试写入它之前,所有东西都是一个引用,那时会在你要写入的地方制作一个副本。
因此,是的,这意味着您正在迭代的数组的值与按索引设置的值不同。
另请参阅:
PHP';foreach';真的有效吗?
foreach($arr as $key => $value) {
$value=$arr[$key];
echo "Array[".$key."]: " . $arr[$key] . "<br>";
echo "Value: " . $value . "<br>";
if (isset($arr[$key+1]))
$arr[$key+1] = $arr[$key+1]*2;
}
我认为您应该在for循环中手动分配$value=$arr[$key];
,以获得您想要的输出。
在foreach
中,PHP
迭代array
的副本,而不是实际的array
。相反,当使用each( )
和for
时,PHP
在原始数组上迭代。因此,如果您在循环中修改数组,您可能会(也可能不会)得到您期望的行为。
我知道发生了什么,但不知道为什么会发生。
value are *2 when index are in series
if array is (1=>1,2=>2)
than o/p is in $arr[$key](for each) 1 value 1,2 value 4
if array is (3=>1,2=>2)
than o/p is in $arr[$key](for each) 3 value 1,2 value 2
if array is (2=>1,3=>2)
than o/p is in $arr[$key](for each) 2 value 1,3 value 4
if array is (1=>5,3=>2,4=>'3',6=>8)
than o/p is in $arr[$key](for each) 1 value 5,3 value 2,4 value 6,6 value 8