考虑具有许多键的大数组$stats,其中一个键是具有大数组作为值的"访问者".

PHP在编写$visitors = $stats['visitors']时会做什么-它是复制数组 struct 和值还是只使用对原始数组的引用?

我应该使用$visitors = &$stats['visitors']吗?

仅读取数据.

我知道PHP在将数组传递给方法或将变量分配给变量时使用写时复制,但CoW在我的情况下也适用于数组子集吗?

推荐答案

考虑一个具有许多键的大数组$stats,其中一个键是"访问者",其值为大array.

该描述暗示了您问题的答案.您已经正确地注意到,PHP数组中的值只是独立的值-您不必做任何特殊的事情来使数组多维化,只需将一个数组作为值放入另一个数组中即可.

这个的答案.

编写$visitors = $stats['visitors']时,PHP做什么?

...因此与对此的答案完全相同:

编写$visitors = $some_visitors时,PHP做什么?

唯一重要的是右手边的value.在您的情况下,您所分配的值是一个大数组;您只是碰巧知道在哪里可以找到该大数组值作为另一个数组中的一个项.

它是复制数组 struct 和值还是只使用对原始数组的引用?

正如您正确所说,PHP对数组使用写时复制:变量将指向已经包含大数组的同一内存,并且其引用计数将增加.只有当其中一个"副本"需要修改时,才会在内存中真正创建新副本.

我是否应该使用$vitors =$stats ' vitors ']?

几乎肯定不是.事实上,这样做可能会使其成为worse,因为引用打破了优化代码所依赖的一些假设.在PHP 7之前,这样做将立即需要之前使用写时复制的任何内容的单独副本;情况不再是这样了(阅读this blog post以了解有关发生变化的大量技术细节)但您仍然不太可能通过参考文献得出任何better,除非您实际上是数组的writing.

Php相关问答推荐

此行动未经授权.升级Laravel时

用户信息更新期间Laravel邮箱验证问题

Laravel 9如何过滤$的项目与结果?

Postgrid Webhook不叫laravel

从WooCommerce邮箱通知中的订单详细信息中删除产品列表

PHP FFI—将PHP数组转换为C指针数组

如何使用URL链接(mdl)切换选项卡

Laravel:让所有用户在一年中的特定月份休息几天

LaravelEloquent 地根据表中的值提取记录

在特定订单状态更改时自定义WooCommerce订单发货项目

闭包绑定$This和垃圾收集器

如何将隐式乘法添加到PHPPEG基本计算器语法中?

Symfony 6.2 IsGraned具有多个角色

扩展 WooCommerce 类触发未捕获错误:未找到WC_Coupon类

根据所选付款方式启用/禁用 WooCommerce 所需的 checkout 字段

从 Laravel 机制中排除目录并直接访问该目录

适当的时区处理 Laravel / Carbon

Laravel 10 单元测试看不到来自 Artisan Command 的数据库更改

如何为多个表的id列设置不同的值

mysql / sql修复多对多数据库中的行