
本文介绍如何在 php 中不依赖 array_merge 等函数,直接、高效地将动态键值对注入已有关联数组,推荐使用 php 5.6+ 的展开运算符(...)实现语义清晰、性能更优的数组扩展。
本文介绍如何在 php 中不依赖 array_merge 等函数,直接、高效地将动态键值对注入已有关联数组,推荐使用 php 5.6+ 的展开运算符(...)实现语义清晰、性能更优的数组扩展。
在 PHP 开发中,常需基于一个基础配置数组(如 $settings = ['height' => 10, 'width' => 20, 'fit' => 'crop'])动态生成多个变体数组,每个变体需保留原始键值,并额外添加一组特定的键值对。传统做法常使用 array_merge(),但该方式存在两个明显缺点:一是语法冗长、可读性差;二是底层会重建数组索引并进行多次哈希表操作,影响性能。
自 PHP 5.6 起引入的展开运算符(splat operator)... 提供了更优雅的替代方案。它允许你将一个关联数组“解包”到另一个数组字面量中,且能精准保留键名与顺序(PHP 7.4+ 更保证了键序稳定性)。关键在于:...$array 必须出现在数组字面量的末尾或中间,且其左侧不能有重复键名(否则后出现的键值会覆盖前者)。
以下为推荐写法:
$settings = ['height' => 10, 'width' => 20, 'fit' => 'crop'];
return new Settings(
[
'detail' => ['foo' => 'bar', ...$settings],
'detail-l' => ['foo2' => 'bar2', ...$settings]
],
[
'small' => ['foo3' => 'bar2', ...$settings]
]
);
✅ 优势说明:
- 语义直观:['foo' => 'bar', ...$settings] 清晰表达“先插入新键,再合并基础配置”;
- 性能更优:避免 array_merge() 的内部遍历与内存复制,尤其在大数组场景下差异显著;
- 代码简洁:无需额外变量或函数调用,一行内完成扩展;
-
类型安全友好:与现代 PHP 类型声明(如 array
)天然兼容。
⚠️ 注意事项:
- 确保 PHP 版本 ≥ 5.6(推荐 ≥ 7.4 以获得稳定的键序保证);
- 若新键与 $settings 中键名重复(如同时定义 'height' => 100),后声明者将覆盖前者,即 ['height' => 100, ...$settings] 中 height 值为 100;
- ... 只能用于一维关联数组,不支持多维展开(需递归处理时仍需 array_merge_recursive 或自定义逻辑);
- 数组必须为纯数组(array),不能是 Traversable 对象(如 ArrayObject),否则会触发 TypeError。
综上,善用 ... 运算符不仅能写出更简洁、可维护的配置组装代码,也是体现 PHP 现代化编码实践的重要细节。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











