考虑下面的代码片段,它通过引用传递它们来直接更改(将值转换为大写)数组的值。
<?php
$colors = array('red', 'blue', 'green', 'yellow');
foreach ($colors as &$color) {
$color = strtoupper($color);
}
unset($color); /* ensure that following writes to
$color will not modify the last array element */
print_r($colors);
?>
输出
Array
(
[0] => RED
[1] => BLUE
[2] => GREEN
[3] => YELLOW
)
我根本不理解上面的代码。我对上述代码的疑问如下:
$color = strtoupper($color);
循环内部的所有foreach
都不理解这个陈述。为什么使用临时变量$color
而在函数strtoupper()
中为什么不传递引用&$color
而只传递$color
?$color
未被设置?在取消设置之前,它包含了什么内容? 简而言之,请逐步解释foreach
循环代码中发生的情况。
请有人回答我的疑惑。
注意:上面的代码示例取自PHP手册的数组章节。
答案 0 :(得分:3)
这是在这里工作的防御性编程。
在$color
循环的每次迭代中,在$color
变量中创建对当前项值的引用,允许向其写入新值。当迭代结束时,$color
变量仍然包含对最后一个数组项的值的引用,允许程序员重用unset()
变量进行写入以更新数组中的该项,这可能不是预期的结果。在循环破坏引用之后<?php
$colors = array('red', 'blue', 'green', 'yellow');
foreach ($colors as &$color) {
$color = strtoupper($color);
}
//unset($color);
/* ensure that following writes to
$color will not modify the last array element */
print_r($colors);
$color='hello';
print_r($colors);
转换变量并避免风险。
在您的示例之上构建:
Array
(
[0] => RED
[1] => BLUE
[2] => GREEN
[3] => YELLOW
)
Array
(
[0] => RED
[1] => BLUE
[2] => GREEN
[3] => hello
)
输出:
document.getElementById('id').value = 'value';