PHP数组去重排序
PHP数组去重排序
引言
数组是PHP最常用的数据结构,去重和排序是开发中反复出现的基础需求。掌握内置函数的正确用法,比自己写循环更高效,也更不容易出错。
一维数组去重
$arr = [3, 1, 2, 3, 1, 5];
$unique = array_unique($arr);
//结果保留首次出现的值,键名不变
注意array_unique默认按字符串比较,去重后键名可能不连续,需要重新索引:
$unique = array_values(array_unique($arr));
关联数组按字段去重
$users = [
['id'=>1,'name'=>'张三'],
['id'=>2,'name'=>'李四'],
['id'=>1,'name'=>'张三副本'],
];
$seen = [];
$unique = array_filter($users, function($item) use (&$seen) {
if (in_array($item['id'], $seen)) return false;
$seen[] = $item['id'];
return true;
});
排序函数区分
- sort():值升序,重置键名;
- rsort():值降序;
- asort():值升序,保留键名;
- ksort():按键名升序;
- krsort():按键名降序。
$score = ['张三'=>88,'王五'=>95,'李四'=>76];
arsort($score); //按分数降序,保留姓名键名
print_r($score);
自定义排序
$users = [['age'=>20],['age'=>35],['age'=>28]];
usort($users, function($a, $b) {
return $a['age'] <=> $b['age']; //太空船运算符比较
});
注意事项
- array_unique对多维数组不能直接按字段去重;
- sort系列会改变原数组,返回bool;
- 中文排序建议用Collator或mb方式;
- 去重后及时array_values重置索引,避免后续遍历异常。
总结
一维去重用array_unique加array_values,多维按字段用array_filter配合标记数组。排序先想清是否保留键名,普通值排序用sort/rsort,关联数组用asort/ksort,复杂规则用usort自定义比较。