会修改原数组的函数有:sort()、rsort()、asort()等排序函数,shuffle(),array_splice();array_walk()也通过引用修改原数组。

PHP 数组函数是否改变原数组,关键不在于“是不是引用传递”,而在于函数本身的设计意图和内部实现——有些函数直接修改原数组(如 sort()),有些则返回新数组(如 array_map()),与参数是否用 &$arr 声明无关。
哪些数组函数会修改原数组?
这类函数通常用于“就地排序、过滤或重组”,它们的参数虽未显式声明为引用,但 PHP 内部对数组使用了写时复制(Copy-on-Write)机制,配合函数逻辑主动修改原变量的底层结构:
-
sort()、rsort()、asort()等排序函数:直接重排原数组键值关系,不返回新数组,只返回布尔值 -
shuffle():随机打乱原数组顺序 -
reverse()(注意:实际是array_reverse(),它不修改原数组;真正修改的是&$arr配合sort()类函数)——这里容易混淆:只有明确设计为“in-place”的函数才改原数组 -
array_splice():可修改原数组(删除+插入),且当传入第四个参数(替换数组)时,会直接变更原数组内容
哪些函数不修改原数组,也不需要引用传递?
绝大多数函数(如 array_filter()、array_map()、array_merge()、array_keys())都遵循“函数式风格”:输入数组 → 返回新数组 → 原数组保持不变。它们内部并不依赖引用,也不修改传入变量的内存结构。
例如:
一个功能强大的B2B与B2C的购物平台,除了原本OSC功能外,增加更新的功能: 一、 取消了register_globals必须开启的限制 二、 將HTML程式碼与PHP程式碼完全分离,採用了smarty 樣板引擎 三、 每支档案includes所需函数与资料库连结,使的网页显示速度明显提升 四、 检视、购买商品群组权限设定 五、 十八岁以下禁购机制 六、 折价券购物抵扣机制 七、 礼券购物机制
立即学习“PHP免费学习笔记(深入)”;
$arr = [3, 1, 4]; $new = array_map(fn($x) => $x * 2, $arr); // $arr 还是 [3, 1, 4];$new 是 [6, 2, 8]
手动使用引用传递的场景很少,但要注意副作用
你确实可以自己定义函数并用 &$arr 接收参数,强制修改原数组:
function uppercaseKeys(&$arr) {
$new = [];
foreach ($arr as $k => $v) {
$new[strtoupper($k)] = $v;
}
$arr = $new; // 赋值给引用变量,影响外部
}
$arr = ['foo' => 'bar'];
uppercaseKeys($arr); // $arr 变成 ['FOO' => 'bar']但这种做法要谨慎:破坏函数纯度、增加调试难度、易引发意外覆盖。除非明确需要“就地更新”且性能敏感(如超大数组避免复制),否则优先用返回新数组的方式。
一个常见误解:&$arr 并不能让 array_map() 修改原数组
即使你这样写:array_map(function(&$x) { $x *= 2; }, $arr);
这并不会改变 $arr 的值——因为 array_map() 传给回调的元素是副本(即使加了 &),且它不把结果写回原数组。真正能就地修改元素的,是 array_walk():
$arr = [1, 2, 3];
array_walk($arr, function(&$x) { $x *= 2; });
// $arr 现在是 [2, 4, 6]注意:array_walk() 第一个参数必须是引用(文档已标明),这是少数几个明确依赖引用传递来修改原数组的内置函数之一。








