我有一个关于PHP以及指针和变量的使用的问题.
以下代码产生了我不希望的东西:
<?php
$numbers = array('zero', 'one', 'two', 'three');
foreach($numbers as &$number)
{
$number = strtoupper($number);
}
print_r($numbers);
$texts = array();
foreach($numbers as $number)
{
$texts[] = $number;
}
print_r($texts);
?>
Run Code Online (Sandbox Code Playgroud)
输出如下
Array
(
[0] => ZERO
[1] => ONE
[2] => TWO
[3] => THREE
)
Array
(
[0] => ZERO
[1] => ONE
[2] => TWO
[3] => TWO
)
Run Code Online (Sandbox Code Playgroud)
注意'TWO'在第二个数组中出现两次.
似乎两个foreach循环之间存在冲突,每个循环都声明一个$ number变量(一次是引用,另一次是值).
但为什么 ?为什么它只影响第二个foreach中的最后一个元素?
关键是PHP没有指针。它有references,这是一个相似但不同的概念,并且存在一些细微的差异。
如果您使用var_dump()而不是 print_r(),则更容易发现:
$collection = array(
'First',
'Second',
'Third',
);
foreach($collection as &$item){
echo $item . PHP_EOL;
}
var_dump($collection);
foreach($collection as $item){
var_dump($collection);
echo $item . PHP_EOL;
}
Run Code Online (Sandbox Code Playgroud)
... 印刷:
First
Second
Third
array(3) {
[0]=>
string(5) "First"
[1]=>
string(6) "Second"
[2]=>
&string(5) "Third"
}
array(3) {
[0]=>
string(5) "First"
[1]=>
string(6) "Second"
[2]=>
&string(5) "First"
}
First
array(3) {
[0]=>
string(5) "First"
[1]=>
string(6) "Second"
[2]=>
&string(6) "Second"
}
Second
array(3) {
[0]=>
string(5) "First"
[1]=>
string(6) "Second"
[2]=>
&string(6) "Second"
}
Second
Run Code Online (Sandbox Code Playgroud)
请注意&最后一个数组项中留下的符号。
总而言之,每当您在循环中使用引用时,最好在最后删除它们:
<?php
$collection = array(
'First',
'Second',
'Third',
);
foreach($collection as &$item){
echo $item . PHP_EOL;
}
unset($item);
var_dump($collection);
foreach($collection as $item){
var_dump($collection);
echo $item . PHP_EOL;
}
unset($item);
Run Code Online (Sandbox Code Playgroud)
...每次都会打印预期的结果。