PHP 8.3 中推荐用 json_encode + array_unique 去重二维数组:先转 JSON 字符串,再去重,最后还原;需确保键顺序一致(可用 ksort 预处理),或按指定字段去重以提升效率。

PHP 8.3 中用 json_encode 去重二维数组,核心思路是:把每个子数组转成 JSON 字符串 → 去重字符串 → 再还原为数组。这个方法简洁、兼容性好,不依赖 serialize(避免资源/闭包报错),也比 in_array 循环更高效。
json_encode + array_unique 去重(推荐基础用法)
适用于子数组只含字符串、数字、布尔、null 和嵌套普通数组(无资源、闭包、对象等不可 JSON 化内容)。
function array_2d_unique_by_json($arr) {
if (!is_array($arr)) return $arr;
// 步骤1:全部转为 JSON 字符串
$jsons = array_map('json_encode', $arr);
// 步骤2:去重字符串(保留首次出现项)
$unique_jsons = array_unique($jsons);
// 步骤3:还原为二维数组,并重置索引
$result = array_map(function($json) {
return json_decode($json, true);
}, $unique_jsons);
return array_values($result);
}调用示例:
$data = [
['id' => 1, 'name' => 'Alice'],
['id' => 2, 'name' => 'Bob'],
['id' => 1, 'name' => 'Alice'], // 重复
['id' => 3, 'name' => 'Charlie']
];
print_r(array_2d_unique_by_json($data));
// 输出含 3 个子数组,重复项已剔除注意键顺序和类型一致性
json_encode 对键顺序敏感。如果原始子数组键名相同但顺序不同(如 ['a'=>1,'b'=>2] vs ['b'=>2,'a'=>1]),它们编码后字符串不同,会被视为不重复。
✅ 解决办法:确保输入子数组键顺序一致;或改用 ksort 预处理:
$jsons = [];
foreach ($arr as $item) {
ksort($item); // 统一按键名排序
$jsons[] = json_encode($item);
}
$unique_jsons = array_unique($jsons);
// 后续同上...按指定字段去重(比如只看 'email' 或 'id')
若你不需要“完全相同才去重”,而是按某字段判重(如保留每个 email 的第一条记录),就别用 json_encode 全量比较,改用键映射法:
立即学习“PHP免费学习笔记(深入)”;
function array_2d_unique_by_field($arr, $field) {
$seen = [];
$result = [];
foreach ($arr as $item) {
if (isset($item[$field]) && !isset($seen[$item[$field]])) {
$seen[$item[$field]] = true;
$result[] = $item;
}
}
return $result;
}
// 用法:array_2d_unique_by_field($users, 'email');这种方法更快、内存更省,且天然支持“保留首个”逻辑。
不复杂但容易忽略。



















