PHP是正确的行为吗?

问题描述 投票:1回答:1

php的行为正确吗?

PHP版本7.1.28PHP版本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"
}

为什么数组中的数据发生变化?周期内无变化。任何解释吗?

php arrays pass-by-reference
1个回答
1
投票

没有错误。您在两个循环中都使用了相同的变量,但是第一次通过引用进行操作,并且在循环后没有取消设置它。这意味着下次更改变量时,将更改源数组。通过引用使用后未设置。

$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"
}

https://3v4l.org/MjlcU

[如果您查看自己的输出,则会在最后一项看到&。这意味着它仅供参考。

© www.soinside.com 2019 - 2024. All rights reserved.