sort、rsort、asort、arsort、ksort、krsort、array_splice、array_walk及引用式foreach会直接修改原数组,而array_unique、array_filter、array_map则返回新数组且不改变原数组。

sort、rsort、asort、arsort 会直接改原数组
这几个排序函数的共同点是:调用后原数组结构立即变化,键名可能丢失或重排,且返回布尔值(true 或 false),不是新数组。
常见错误现象:sort($arr) 后直接 var_dump($arr) 发现索引变成 0,1,2...,关联键全没了;或者以为 asort() 只是“返回排序结果”,结果原数组已被重排,后续逻辑出错。
-
sort()和rsort():只按值升序/降序,强制转为纯数字索引,丢弃所有字符串键 -
asort()和arsort():按值排序但保留键名,适合关联数组(如['a' => 3, 'b' => 1]) -
ksort()和krsort():按键名排序,同样直接修改原数组
array_splice 会修改原数组
array_splice() 是少数几个明确设计为“就地操作”的数组函数之一。它从原数组中移除一段元素,并可选地插入新内容——这个过程直接作用于传入的数组变量。
使用场景:实现队列 pop/push、动态截断日志数组、替换配置片段。
- 不带第四个参数时(如
array_splice($arr, 2, 1)):删掉第 2 位元素,原数组长度减 1 - 带第四个参数时(如
array_splice($arr, 0, 2, ['x', 'y'])):删前两位,再在开头插入['x','y'] - 注意:即使你接住返回值(如
$removed = array_splice(...)),原数组仍已被修改
array_walk 和 foreach 引用循环会修改原数组
这两个不是“函数式数组工具”,而是控制结构或遍历接口,它们是否修改原数组,取决于你是否用了引用。
关键区别:array_walk() 的第一个参数必须是引用(array &$array),否则报错;而 foreach 默认遍历副本,加 &$v 才能改原值。
-
array_walk($arr, function(&$v) { $v .= '_mod'; });:安全生效,$arr元素末尾都加了_mod -
foreach ($arr as &$v) { $v *= 2; } unset($v);:必须unset($v),否则下一次循环可能污染相邻变量 - 漏写
&是高频错误:比如foreach ($arr as $v) { $v = null; }—— 原数组完全没变
array_unique、array_filter、array_map 这些不会改原数组
它们统一返回新数组,原数组保持 100% 不变。这是 PHP 函数式处理的默认契约,也是你写可预测代码的基础。
容易踩的坑在于“以为返回值自动覆盖了原变量”——比如写了 array_filter($data, $cb) 却没赋值给变量,还继续用 $data,结果发现空值没被过滤。
-
$filtered = array_filter($data, $cb);:正确,$data不动,$filtered是筛选后的新数组 -
array_unique($data); var_dump($data);:输出仍是原始重复数组,因为没接返回值 - 键名保留行为要留意:
array_filter()保留原始键,若需重排索引,得套一层array_values()
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











