php - 了解 PHP 中奇怪的引用/循环行为

标签 php

真的不知道如何描述这一点,所以我会尝试让代码解释。

$numbers = [
    10,
    20,
    30
];

foreach($numbers as &$number) {
    $number = 1*$number;
}

var_dump($numbers);
foreach($numbers as $number) {
    echo $number . "\n";
}

var_dump给出以下输出:

array(2) {
  [0]=>
  int(10)
  [1]=>
  int(20)
  [2]=>
  &int(30)
}

但是循环同一数组会给出:

10
20
20

当我迭代数组时,为什么我得到的前两个元素是我定义的数字,但第三个元素似乎是第二个元素的副本。

为什么var_dump具有“预期”结果,但包含第三个预期值的引用符号?

最佳答案

第一个循环退出后,$number 仍然存在,作为对数组中最后一项的引用。

foreach($numbers as &$number) { ... }
// $number still "points to" $numbers[2] here

然后,当第二个循环运行时,您可以像新变量一样重新使用 $number,但它已被设置为引用:

foreach($numbers as $number) { ... }

实际上,PHP 将数组中的迭代值放入 $number 变量中,但 $number 变量不是一个空变量——它基本上是一个现有的指针到数组元素,所以第二个循环基本上是这样做的:

put $numbers[0] into $numbers[2]
put $numbers[1] into $numbers[2]
put $numbers[2] into $numbers[2]

您可以通过以下方式避免这种情况:

  • 在第二个循环中使用除 $number 之外的变量。
  • 在第一个循环后调用 unset($number)
  • 不使用引用文献。

我推荐第三个选项,在第一个循环中执行此操作:

foreach ($numbers as $index => $number) {
    $numbers[$index] = 1 * $number;
}

关于php - 了解 PHP 中奇怪的引用/循环行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65648377/

相关文章:

php - 使用 javascript 或一些外部网络编码语言运行 apt-get

php - 在我的情况下如何在 mysql 中定义 FOREIGN KEY 约束不起作用

php - Laravel 工厂关联只关联最后的数据。如何解决这个问题?

php - 我正在尝试通过串行端口与微 Controller 进行通信。但我的 php 脚本给了我一个错误

php - Laravel 缓存返回损坏的数据(redis 驱动程序)

php - 动态获取列中每个唯一值的计数

php - 5 分钟长轮询示例的简单指南不起作用

php - 如何将 iPhone 联系人与数据库同步?

javascript - 如何使用 wp_localize_script 将数组传递给 jQuery?

javascript - 如何在 php 循环中为网格中的每个帖子运行 jquery (wordpress)