我们说我得到了以下代码:
$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]来解决这个问题吗?
答案 0 :(得分:0)
据我所知,PHP使用“copy on write”,所以在你尝试写入之前,所有内容都是引用,那时你会写一个副本。
所以是的,这意味着您迭代的数组的值与索引设置值不同。
另见:
答案 1 :(得分:0)
我对所发生的事情有答案,但不知道为什么会发生。
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
答案 2 :(得分:0)
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
会迭代原始数组。因此,如果您在循环内修改数组,您可能(或可能不)获得您期望的行为。