数组是 PHP 开发中最常用的数据结构之一。接口返回数据、数据库查询结果、配置项、表单字段、分类列表、标签集合,几乎都会用到数组。掌握常见数组操作,能让数据处理代码更简洁。
PHP 的数组同时支持索引数组和关联数组,相关函数也很多。本文围绕实际开发中最常用的排序、过滤、合并和去重,整理一套清晰的使用方法和注意事项。
索引数组和关联数组
索引数组使用数字下标,关联数组使用字符串键。很多 PHP 数组函数对这两类数组的键处理方式不同,使用前要先明确数据结构。
$names = ['Alice', 'Bob', 'Tom'];
$user = [
'id' => 1,
'name' => 'Alice'
];
如果只是列表数据,通常用索引数组;如果每项需要字段名,通常用关联数组。
遍历数组
foreach 是 PHP 中最常用的数组遍历方式。它既可以遍历值,也可以同时拿到键和值。
foreach ($names as $name) {
echo $name;
}
foreach ($user as $key => $value) {
echo $key . ':' . $value;
}
实际项目中,遍历时要注意输出转义,避免把用户输入直接输出到页面。

基础排序
sort() 可以对索引数组按值升序排序,但它会重建数字索引。
$numbers = [3, 1, 2];
sort($numbers);
如果需要降序排序,可以使用 rsort()。这两个函数适合简单索引数组。
保留键排序
如果需要保留数组键,可以使用 asort() 按值排序,或 arsort() 按值降序排序。
$scores = [
'Alice' => 90,
'Bob' => 80,
'Tom' => 95
];
arsort($scores);
关联数组排序时,是否保留键非常重要。用户 ID、配置名、字段名这类键通常不能丢。
按键排序
ksort() 和 krsort() 用于按键排序。它们常用于配置数组、字典数据或需要按字段名整理的场景。
$config = [
'cache' => true,
'app' => 'demo',
'debug' => false
];
ksort($config);
按键排序通常不改变值,只调整键的顺序。
自定义排序
数组元素是复杂结构时,可以使用 usort() 自定义排序。比如按用户年龄排序。
usort($users, function ($a, $b) {
return $a['age'] <=> $b['age'];
});
<=> 是太空船操作符,适合比较数字和字符串。自定义排序会重建数字索引,如果要保留键,需要选择其他方案。
过滤数组
array_filter() 可以按条件过滤数组。回调返回 true 的元素会被保留。
$activeUsers = array_filter($users, function ($user) {
return $user['status'] === 'active';
});
array_filter() 默认会保留原来的键。如果最终需要连续数字索引,可以再使用 array_values() 重建索引。
提取字段
array_column() 可以从二维数组中提取某一列,常用于提取 ID、名称列表等。
$ids = array_column($users, 'id');
它也可以用某个字段作为结果数组的键,适合把列表转换成字典结构。
$userMap = array_column($users, null, 'id');
合并数组
array_merge() 可以合并数组。对于数字键,会重新编号;对于字符串键,后面的值会覆盖前面的值。
$result = array_merge($defaultConfig, $userConfig);
这很适合默认配置和用户配置合并。要注意覆盖顺序,后面的数组优先级更高。
数组加号
PHP 数组还可以使用 + 合并。它和 array_merge() 不一样:如果键已经存在,左侧数组会保留原值。
$result = $userConfig + $defaultConfig;
这种写法适合“用户配置优先,不存在时使用默认值”的场景。不要把它和 array_merge() 混用而不理解差异。
数组去重
array_unique() 可以去除数组中的重复值。
$tags = ['php', 'mysql', 'php'];
$uniqueTags = array_unique($tags);
它会保留第一次出现的值,并保留原键。如果需要重建索引,可以再套一层 array_values()。
$uniqueTags = array_values(array_unique($tags));
对象数组去重
如果是二维数组,通常要按某个字段去重。可以用一个临时映射记录已出现的 ID。
$seen = [];
$result = [];
foreach ($users as $user) {
$id = $user['id'];
if (isset($seen[$id])) continue;
$seen[$id] = true;
$result[] = $user;
}
到底保留第一次还是最后一次,要根据业务需求决定。列表展示通常保留第一次,数据更新可能希望保留最后一次。
判断元素存在
in_array() 用于判断值是否存在,array_key_exists() 用于判断键是否存在。二者不要混淆。
in_array('php', $tags, true);
array_key_exists('name', $user);
in_array() 建议开启第三个参数严格比较,避免数字字符串和数字之间出现意外匹配。
常见错误
第一种错误是排序后丢了关联键。第二种错误是过滤后没有重建索引,前端收到不连续数组。第三种错误是不理解 array_merge() 和数组加号的区别。第四种错误是用 array_unique() 处理复杂二维数组,结果不符合预期。
实践建议
处理 PHP 数组时,先判断是否需要保留键。排序要选对 sort、asort、ksort 或 usort;过滤后如果要返回 JSON 列表,通常用 array_values() 重建索引;合并配置时明确覆盖顺序;去重时明确按值还是按字段。
数组操作函数很多,不需要一次背完。围绕排序、过滤、合并、去重这几类常见场景掌握清楚,日常 PHP 数据处理就会顺手很多。














暂无评论内容