PHP数组操作常用方法:排序、过滤、合并与去重实践

数组是 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;
}

实际项目中,遍历时要注意输出转义,避免把用户输入直接输出到页面。

PHP数组操作教程配图:排序过滤合并与去重
PHP 数组操作要先明确键是否需要保留,再选择合适的函数。

基础排序

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 数据处理就会顺手很多。

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容