php 7.2 去除含布尔值二维数组重复项,推荐用 array_unique($arr, sort_regular);若键序不固定则用 foreach + in_array($item, $unique, true);慎用序列化法,指定字段去重可用 array_column + array_keys。

用 array_unique + SORT_REGULAR 标志(最简推荐)
PHP 7.2+ 的 `array_unique()` 已支持 `SORT_REGULAR` 模式,能正确处理布尔值、null、数字、字符串等类型的严格比较,无需手动序列化。直接调用即可:
$arr = [
['name' => 'Alice', 'active' => true],
['name' => 'Bob', 'active' => false],
['name' => 'Alice', 'active' => true], // 重复
['name' => 'Carol', 'active' => true],
];
$result = array_unique($arr, SORT_REGULAR);
// 自动保留首个出现项,键名不变,布尔值不被转换
✅ 优点:简洁、原生支持、兼容布尔值、保持键名、性能好
❌ 注意:要求 PHP ≥ 7.2.0 —— 你当前环境满足;且子数组键顺序必须一致(如 ['active'=>true, 'name'=>'Alice'] 与 ['name'=>'Alice','active'=>true] 被视为不同)
用 foreach + in_array(..., true)(兼容性最强)
当数组键顺序不固定,或需 100% 确保布尔值按 `===` 判断时,手动遍历加严格比较更可靠。代码示例:
$unique = [];
foreach ($arr as $item) {
if (!in_array($item, $unique, true)) {
$unique[] = $item;
}
}
✅ 优点:完全尊重布尔值(true !== 1, false !== 0),不依赖序列化,逻辑清晰
❌ 缺点:时间复杂度 O(n²),大数据量时略慢(但对千条以内数据无感)
用 serialize + array_unique(慎用布尔值场景)
虽然常见,但在含布尔值的数组中需格外注意:`serialize()` 本身能正确保存 `b:1;` / `b:0;`,但若后续用 `implode` 或字符串拼接(如 `join(',', $v)`)会把 `true` 变成 `"1"`、`false` 变成 `""`,造成误判。如果坚持用此法,请严格使用:
- 只用
serialize()和unserialize() - 禁用任何字符串切割(如
implode、join、正则替换)
$serialized = array_map('serialize', $arr);
$unique_serialized = array_unique($serialized);
$result = array_map('unserialize', $unique_serialized);
⚠️ 提示:该方式在 PHP 7.2 下安全,但比前两种多一次序列化开销,且无法处理含资源、闭包等不可序列化内容(你的数据不含这些,可忽略)
按指定字段去重(如只看 'active' 布尔值是否重复)
若业务逻辑只需根据某个布尔字段(如'active')去重,而非整行相等,可用 array_column + array_keys 组合:
// 保留每个唯一 active 值首次出现的完整子数组 $active_values = array_column($arr, 'active'); $first_keys = array_keys(array_flip($active_values)); // 自动去重并取首次索引 $result = array_intersect_key($arr, array_flip($first_keys));
例如:[true, false, true] → 取索引 0 和 1 对应的元素,跳过第二个 true
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











