strval()不能直接用于二维数组去重,因其对所有数组均返回字符串"array",无法区分不同子数组;正确做法是用serialize或json_encode转为唯一字符串后配合array_unique去重。

PHP 8.0 中 strval() 不能直接用于二维数组去重,因为它只作用于单个值,且不改变原数组结构。要去重二维数组的“元素”(通常指子数组),关键不是用 strval 转换,而是将子数组序列化为唯一字符串,再借助数组函数实现去重。
为什么不能直接用 strval 处理二维数组?
strval() 接收一个标量(如 int、string、bool)或对象(需实现 __toString),对数组会返回字符串 "Array" —— 所有子数组都变成相同的字符串,无法区分:
var_dump(strval([3,4])); // string(5) "Array"
正确做法:用 serialize + array_unique 实现二维数组去重
核心思路是把每个子数组「稳定地转成唯一字符串」,再用 array_unique 去重,最后反序列化还原:
- 使用
serialize($subArray)生成可区分的字符串表示(保留键名、类型、顺序) - 用
array_unique(..., SORT_REGULAR)去重(PHP 8.0 支持此模式) - 用
unserialize()恢复为数组(注意:确保数据可信,避免反序列化风险)
示例代码:
$arr = [[1,2], [3,4], [1,2], [5]];$serialized = array_map('serialize', $arr);
$unique_serialized = array_unique($serialized);
$result = array_map('unserialize', $unique_serialized);
// $result === [[1,2], [3,4], [5]]
更安全的替代方案:用 json_encode(推荐)
若子数组只含 UTF-8 字符串、数字、null、布尔值(无资源、闭包、对象等),json_encode 更安全、可读、无反序列化风险:
- 保证键顺序一致(PHP 7.3+
json_encode默认保持关联数组键序) - 忽略浮点精度等细微差异(如
1.0和1在 JSON 中都编码为1,需按需处理) - 示例:
$keys = array_map('json_encode', $arr); $unique = array_keys(array_flip($keys)); $result = array_map(fn($k) => json_decode($k, true), $unique);
注意事项
- 二维数组去重默认是「全等比较」,即键名、顺序、类型、值都相同才视为重复
- 如果想忽略键名或顺序(如视
[1,2]和[2,1]为相同),需先排序子数组再序列化 - PHP 8.0 的
array_unique第二参数支持SORT_STRING或SORT_REGULAR,但对序列化后的字符串,用SORT_STRING即可
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











