unset()删除后键名不重排,数字索引不会自动收缩,如$arr=[0=>'a',1=>'b',2=>'c']执行unset($arr[1])后变为[0=>'a',2=>'c'],foreach正常但for循环可能跳过元素。

unset() 删除后键名不重排,遍历时可能出错
直接用 unset() 删掉某个键,数组的数字索引不会自动收缩。比如 $arr = [0 => 'a', 1 => 'b', 2 => 'c'],执行 unset($arr[1]) 后变成 [0 => 'a', 2 => 'c']——看着像两个元素,但 foreach 没问题,for ($i=0; $i<count> 就会报 <code>Undefined index: 1。
- 需要连续数字索引时,删完必须跟
$arr = array_values($arr) -
unset()对关联键安全,删'name'不影响其他键 - 别在
foreach中边遍历边unset(),PHP 可能跳过下一个元素
array_filter() 按值删除更稳妥,但默认保留键名
想删掉所有值为 null、'' 或某个特定字符串的元素,array_filter() 是最常用也最不容易出错的方式。它默认会过滤掉“falsy”值(false、0、''、null),但注意:键名原样保留。
- 只删空值:
$arr = array_filter($arr) - 按条件删(比如去掉所有
'N/A'):$arr = array_filter($arr, function($v) { return $v !== 'N/A'; }) - 要重排数字键,后面加
array_values(),否则json_encode()可能输出对象而非数组
array_splice() 删除并重排索引,适合切片式操作
当你明确知道要从第几个位置删几个元素,且希望结果自动重排索引,array_splice() 是最直白的选择。它会修改原数组,并返回被删的部分。
- 删掉索引 2 开始的 1 个元素:
array_splice($arr, 2, 1) - 删掉前两个元素:
array_splice($arr, 0, 2) - 第三个参数为 0 时,是插入操作,不是删除——容易看错参数顺序
- 对关联数组慎用,它依赖数字偏移,和键名无关;如果数组没显式定义数字键,行为可能反直觉
array_diff() 和 array_diff_key() 区分“按值删”和“按键删”
批量删除多个已知值或多个已知键时,这两个函数比循环 + unset() 更简洁。但名字太像,用错就全删错了。
立即学习“PHP免费学习笔记(深入)”;
- 按值删除多个项:
$arr = array_diff($arr, ['bad', 'unwanted'])—— 注意第二个参数是数组 - 按键删除多个项:
$arr = array_diff_key($arr, array_flip(['key1', 'key2']))—— 因为array_diff_key()比较的是键名,所以得先翻转 -
array_diff()会重新索引,array_diff_key()保留原键名 - 值是数组或对象时,
array_diff()会报Notice: Array to string conversion,不能直接用
最常被忽略的是:删完是否真需要重排索引。很多 bug 其实不是删错了,而是后续代码假定了索引连续,或者 JSON 输出格式不符合前端预期。动手前先问一句:这里到底要的是“逻辑上少了那个元素”,还是“结构上必须是紧凑数组”。











