array_reverse()不支持去重,二维数组需手动序列化或按字段去重;先反转再用serialize+array_unique可通用处理,按id等唯一键去重更高效。

PHP 7.4 中 array_reverse() 本身**不支持直接去重**,它只负责反转数组顺序;去重需额外使用如 array_unique() 等函数。对二维数组而言,关键难点在于:**PHP 原生 array_unique() 默认不支持多维数组比较**(会报 Warning 并把子数组当作字符串处理,结果不可靠)。
先明确:二维数组去重需自定义逻辑
因为 array_unique($arr, SORT_REGULAR) 在 PHP 7.4 中对二维数组效果有限(内部仍可能触发类型转换问题),稳妥做法是手动遍历 + 序列化判重,或用 array_column() + 单字段去重(若只需按某列去重)。
方法一:反转后再用 serialize + array_unique 去重(通用二维数组)
将每个子数组序列化为唯一字符串,去重后再反序列化:
$original = [
['id' => 1, 'name' => 'Alice'],
['id' => 2, 'name' => 'Bob'],
['id' => 1, 'name' => 'Alice'], // 重复项
];
// 步骤1:反转
$reversed = array_reverse($original);
// 步骤2:序列化 → 去重 → 反序列化
$serialized = array_map('serialize', $reversed);
$unique_serialized = array_unique($serialized);
$unique = array_map('unserialize', $unique_serialized);
// $unique 即为反转后去重的结果(保持反转后的顺序)
方法二:按指定键去重(更高效,适合有唯一标识字段的场景)
如果二维数组有明确唯一键(如 'id'),可用 array_column() 提取该列,再用 array_intersect_key() 过滤:
$original = [
['id' => 1, 'name' => 'Alice'],
['id' => 2, 'name' => 'Bob'],
['id' => 1, 'name' => 'Alice'],
];
$reversed = array_reverse($original);
// 按 'id' 去重,保留最后一个出现的(即反转后第一个同 id 的)
$ids = array_column($reversed, 'id');
$unique_ids = array_keys(array_unique($ids)); // 获取去重后保留的键
$result = array_intersect_key($reversed, array_flip($unique_ids));
注意事项
-
顺序很重要:先
array_reverse()再去重,才能保证“反转后保留首次出现的重复项”;反之则保留原数组中首次出现的。 -
关联键会保留:
array_reverse($arr, true)可保留原始键名(默认 false 会重置为数字索引),按需选择。 - 性能考虑:序列化方案简单通用,但大数据量时稍慢;按字段去重更快,但要求存在稳定唯一键。
不复杂但容易忽略:二维数组去重从来不是单个函数能搞定的事,关键是理解 array_reverse 和 array_unique 的分工——一个调序,一个筛重,中间得搭桥。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











