为什么临时变量需要更改数组元素以及为什么需要在最后设置它?

时间:2017-11-10 09:19:47

标签: php arrays foreach reference 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);

?>

输出

Array
(
    [0] => RED
    [1] => BLUE
    [2] => GREEN
    [3] => YELLOW
)

我根本不理解上面的代码。我对上述代码的疑问如下:

  1. 我从$color = strtoupper($color);循环内部的所有foreach都不理解这个陈述。为什么使用临时变量$color而在函数strtoupper()中为什么不传递引用&$color而只传递$color
  2. 为什么变量$color未被设置?在取消设置之前,它包含了什么内容?
  3. 评论的含义“确保以下写入 $ color不会修改最后一个数组元素“作为数组中的最后一个元素,即黄色也会被修改?
  4. 简而言之,请逐步解释foreach循环代码中发生的情况。

    请有人回答我的疑惑。

    注意:上面的代码示例取自PHP手册的数组章节。

1 个答案:

答案 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';

https://eval.in/897010