PHP 在 foreach 中通过引用传递[重复]

2023-12-31

我有这个代码:

$a = array ('zero','one','two', 'three');

foreach ($a as &$v) {

}

foreach ($a as $v) {
  echo $v.PHP_EOL;
}

有人可以解释一下为什么输出是: 零一二二。

来自 zend 认证学习指南。


我不得不花几个小时来弄清楚为什么 a[3] 在每次迭代中都会发生变化。这就是我得到的解释。

PHP 中有两种类型的变量:普通变量和引用变量。如果我们将一个变量的引用分配给另一个变量,该变量就成为引用变量。

例如在

$a = array('zero', 'one', 'two', 'three');

如果我们这样做

$v = &$a[0]

第 0 个元素($a[0]) 成为参考变量。$v指向该变量;因此,如果我们做出任何改变$v,它将反映在$a[0]反之亦然。

现在如果我们这样做

$v = &$a[1]

$a[1]将成为参考变量并且$a[0]将成为一个普通变量(因为没有其他人指向$a[0]它被转换为普通变量。 PHP 足够聪明,可以在没有其他人指向它时将其设为普通变量)

这是第一个循环中发生的情况

foreach ($a as &$v) {

}

最后一次迭代之后$a[3]是一个参考变量。

Since $v正在指向$a[3]任何改变$v结果改变为$a[3]

在第二个循环中,

foreach ($a as $v) {
  echo $v.'-'.$a[3].PHP_EOL;
}

在每次迭代中作为$v变化,$a[3]变化。 (因为$v仍然指向$a[3])。这就是为什么$a[3]每次迭代都会发生变化。

在最后一次迭代之前的迭代中,$v被分配值“二”。自从$v指着$a[3], $a[3]现在得到值“二”。请记住这一点。

在最后一次迭代中,$v(这指向$a[3]) 现在的值为“二”,因为$a[3]在上一次迭代中设置为 2。two被打印。这解释了为什么在最后一次迭代中打印 $v 时会重复“two”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP 在 foreach 中通过引用传递[重复] 的相关文章

随机推荐

  • SQL 和 C# 中两个日期计算之间的日期差异产生不同的结果

    我正在计算两个日期的日差 在 C 中 diffdays EndDate StartDate Days 因此 考虑到结束日期为 6 26 2015 开始日期为 6 10 2015 diffdays 值为 15 如调试时的 自动 部分所示 在
  • 在 WordPress 中缓存自定义社交分享计数

    我真的很喜欢有一个股票柜台在我的博客文章上 我注意到它实际上鼓励访问者自己分享内容 因为没有真正令我满意的 WordPress sharecount 插件 其中大多数都需要大量调用 所以我自己编写了代码 它工作完美 但仍然减慢了我的网站速度
  • JavaScript - 我如何了解“闭包”的用法?

    维基百科 自由的百科全书 闭包 计算机科学 在计算机科学中 闭包是 在中评估的函数 环境包含一个或多个 绑定变量 当被调用时 函数可以访问这些变量 闭包的显式使用是 与函数式编程相关 以及诸如 ML 和 口齿不清 诸如以下对象的构造 其他语
  • 在 Electron 中处理表单的正确方法是什么?

    表单 html 和提交事件是 渲染器 的一部分 提交的数据应该在主流程中可用 提交表单并使数据可在 main js 中访问的正确方法是什么 我应该简单地使用 远程 模块将数据传递到 main js 中的函数还是有更好的方法 我们使用服务 A
  • MySql中如何使用触发器制作外键

    我想使用触发器在MySql中创建外键 我有以下表格 1 内容 表 教师 ID varchar 20 子 ID varchar 20 路径 varchar 100 文件名 varchar 100 2 老师 表 教师 ID varchar 20
  • 如何向我的班级用户表明验证要求?

    我正在实现一个类 该类使用非常严格定义的模式封装 xml 文档 我不控制架构 类中的属性之一用于模式指示必须与特定正则表达式匹配的元素值 在属性的设置器中 如果字符串与表达式不匹配 我将引发异常 我的问题是 如何才能更好地向我班级的用户传达
  • 如何将 Visual Studio 2019 中的 .NET 版本更改为 .NET Framework 4.7.2?

    我怎样才能将 NET更改为 NET Framework 4 7 2 我已经两天了 真的很挣扎 我正在做一个 WinFormApp 只能使用 NET 5 或 NET Core 3 1 但我需要 NET Framework 4 7 2 作为另一
  • 反应式闪亮模块共享数据

    我正在尝试使用模块创建一个闪亮的应用程序 两个数据帧 表 a 和 b 是反应性的并且可以修改 第三个数据帧 表 c 也是反应性的并且基于表 a 和 b 我尝试按照这个question https stackoverflow com ques
  • PayPal IPN 意外变化

    从 2017 年 3 月 8 日左右开始 我们注意到一些 不是全部 PayPal IPN 出现了一些异常行为 PayPal 似乎正在推出某种变化 还有一些其他人报告了其他事情 例如 PayPal 从 IPN 端点中删除的 QueryStri
  • std::unordered_set 元素的迭代顺序是否保证始终相同?

    如果迭代的元素std unordered set多次而不更改集合的内容 但可能从中读取 计算其大小等 是否保证每次都会以相同的顺序访问元素 在你提到的具体情况下 是的 因为该标准明确规定了何时进行重新散列 并因此重新排序 它仅在插入期间发生
  • C# Random 不像 random 那样工作

    我有一个图 每个节点有 4 个子节点 我编写了一个算法来生成从开始节点到结束节点的随机路径 在每个节点 它选择一个随机的下一个节点 访问过的节点可以重新访问 代码如下 public List
  • Cuda 中未找到 HANDLE_ERROR 错误

    global void add int a int b int c c a b int main void int c int dev c HANDLE ERROR cudaMalloc void dev c sizeof int add
  • Sunspot / Solr / Rails:模型关联未在索引中更新

    我的应用程序中有一个 Fieldnote 模型 它通过名为 fieldnote activities 的表附加了 many activities 然后我这样定义一个可搜索索引 searchable auto index gt true au
  • 如何让 ASP.NET Web API(自托管)在 *仅* 本地主机上侦听?

    我正在按照这个例子here http www dotnetcurry com ShowArticle aspx ID 896用于自托管 ASP NET Web API 服务 但是 当在基地址中指定 localhost 作为主机时 它会被转换
  • 系列的第 n 项

    我们必须找到这个级数的第n项http oeis org A028859 http oeis org A028859 n 答案应该以 1000000007 为模 我已经编写了代码 但是当 n a 是一个巨大的数字时 时间限制就超出了 incl
  • 其他同步方法

    除了使用synchronized关键字之外 如何在java中同步方法 你可以使用java util concurrent locks封装 特别是Lock接口 Lock l l lock try access the resource pro
  • 在图像控制中以 5 秒时间间隔显示文件夹中的所有图像

    我有一个包含 1000 张图像的文件夹 图像名称的顺序为 ICON000 ICON001 直到 ICON 999 我需要它们以 5 秒的时间延迟按顺序显示在我的 WPF 图像控件中 我使用文件对话框来获取特定文件夹的路径和图像的相应前缀 图
  • JavaScript ES6 类可以与异步代码库一起使用吗?

    什么可以ES6 类 https developer mozilla org en US docs Web JavaScript Reference Classes作为一种组织模式 提供异步代码 下面是一个 ES7 async await 的
  • Bootstrap 导航栏边距

    我想让导航栏内容的左右边距变小 以便 品牌 最左侧的组件 在左侧显示得比默认值更多 右侧组件的情况也是如此 有人可以指出我要修改的相关较少变量吗 Thanks 对于基本布局 您想要的 CSS 选择器是 body gt navbar bran
  • PHP 在 foreach 中通过引用传递[重复]

    这个问题在这里已经有答案了 我有这个代码 a array zero one two three foreach a as v foreach a as v echo v PHP EOL 有人可以解释一下为什么输出是 零一二二 来自 zend