php
的行为正确吗?
在PHP
版本7.1.28
和PHP
版本7.2.13
上测试为什么列表更改了?是PHP
的错误,还是我什么都不知道?
$label_list = explode(',', '1111, 22222, 33333');
foreach($label_list as &$label_item) {
$label_item = trim(mb_strtolower($label_item));
}
var_dump($label_list); // source list
foreach ($label_list as $label_item) {
var_dump($label_list); //? wtf list
}
结果数据:
array(3) {
[0]=> string(4) "1111"
[1]=> string(5) "22222"
[2]=> &string(5) "33333"
}
array(3) {
[0]=> string(4) "1111"
[1]=> string(5) "22222"
[2]=> &string(4) "1111"
}
array(3) {
[0]=> string(4) "1111"
[1]=> string(5) "22222"
[2]=> &string(5) "22222"
}
array(3) {
[0]=> string(4) "1111"
[1]=> string(5) "22222"
[2]=> &string(5) "22222"
}
为什么数组中的数据发生变化?周期内无变化。任何解释吗?
没有错误。您在两个循环中都使用了相同的变量,但是第一次通过引用进行操作,并且在循环后没有取消设置它。这意味着下次更改变量时,将更改源数组。通过引用使用后未设置。
$label_list = explode(',', '111, 222, 333');
foreach($label_list as &$label_item) {
$label_item = trim(mb_strtolower($label_item));
}
unset($label_item); // unset the by reference variable
var_dump($label_list); // source list
foreach ($label_list as $label_item) {
var_dump($label_list); //? wtf list
}
输出:
array(3) {
[0]=>
string(3) "111"
[1]=>
string(3) "222"
[2]=>
string(3) "333"
}
array(3) {
[0]=>
string(3) "111"
[1]=>
string(3) "222"
[2]=>
string(3) "333"
}
array(3) {
[0]=>
string(3) "111"
[1]=>
string(3) "222"
[2]=>
string(3) "333"
}
array(3) {
[0]=>
string(3) "111"
[1]=>
string(3) "222"
[2]=>
string(3) "333"
}
[如果您查看自己的输出,则会在最后一项看到&
。这意味着它仅供参考。