php数组传参默认按值传递,修改副本不影响原数组;需引用传递加&,注意foreach引用遍历后unset($v),大数组用引用省内存,键名需统一大小写处理。

PHP 函数里传数组,直接写变量名就行
PHP 默认按值传递参数,数组也不例外——传进去的是副本,函数里改它,不影响外面的原数组。想改原数组?得加 & 显式引用传递,否则白忙活。
常见错误现象:array_push($arr, 'new') 在函数里执行后,调用处的 $arr 没变;或者函数返回了新数组,但忘了接住,以为“已经改好了”。
- 普通场景(读取/计算):直接传
$data,安全省心 - 修改原数组(如追加、过滤、重排):参数声明写成
function modify(&$arr) - 注意:
foreach ($arr as $k => $v)默认也是遍历副本,要改键值必须写foreach ($arr as &$v),且循环完记得unset($v),否则后续可能意外污染
用 func_get_args() 接收不确定个数的数组参数
当函数要兼容「传一个数组」或「传多个数组」时,别硬写一堆形参,用 func_get_args() 更灵活。但它返回的是所有参数的列表,得自己判断哪些是数组、哪些不是。
使用场景:工具类函数如 array_merge_deep() 或日志批量写入 log_batch(...$entries)。
立即学习“PHP免费学习笔记(深入)”;
-
func_get_args()返回的是普通数组,不是引用,改它不影响原始参数 - 如果其中某个参数是数组,又想修改它,得先用
is_array()判断,再对具体元素做引用处理 - PHP 5.6+ 更推荐用展开运算符:
function foo(...$arrays),此时$arrays就是包含所有实参的数组,语义更清晰
传大数组时性能掉得明显?小心内存复制
PHP 数组本质是哈希表结构,按值传递会触发完整复制。一个几 MB 的二维数组传进函数,内存占用瞬间翻倍,还拖慢执行速度。
性能影响:在循环中高频调用、或处理导出数据、图像像素数组等场景下,这个问题会立刻暴露。
- 确认是否真需要修改原数组——如果只是遍历统计,传引用
&$data能省下 90% 以上内存开销 - 避免在函数内部用
json_encode($data)或serialize($data)再复制一次,尤其当$data已经很大 - PHP 7.4+ 引入了只读数组(
readonly),但目前仅限于类属性,函数参数还不支持,别指望靠它自动优化
关联数组键名大小写敏感,传参前没清理就容易丢数据
PHP 关联数组的键是严格区分大小写的,$user['Name'] 和 $user['name'] 是两个键。从 JSON 解析、API 请求、表单提交来的数组,键名格式混乱很常见,直接传进函数可能导致逻辑跳过或报 undefined index。
使用场景:处理前端 POST 数据、第三方 API 返回的 stdClass 转数组、CSV 导入后的字段映射。
- 别依赖函数内部去“猜”键名,统一在调用前标准化:
array_change_key_case($input, CASE_LOWER) - 如果函数必须兼容多种输入,开头加校验:
isset($data['id']) || isset($data['ID']) || isset($data['Id'])不如提前归一化 - 注意
array_change_key_case()返回新数组,不修改原数组;要改原数组就得赋值回去或传引用
数组传参看着简单,但引用控制、内存、键名一致性这三块,哪块松动都会在上线后突然冒泡。特别是多人协作时,有人传引用、有人传值、有人顺手 json_decode($json, true) 后直接塞进去——结果谁也说不清数据到底被复制了几遍、改到了哪一层。