PHP中如何移除父数组中的重复子数组?
嘿,这个问题我之前做项目的时候也碰到过,给你几个实用的PHP解决思路,亲测好用:
方法一:利用序列化+数组键唯一性去重
这个方法是最直观的思路:因为PHP数组的键是唯一的,我们可以把每个子数组序列化后作为临时数组的键,这样重复的子数组会自动被覆盖,最后再把值取出来就行。
代码示例:
// 你的原始数组 $originalArray = [ ['key1' => 14, 'key2' => 32], ['key1' => 14, 'key2' => 11], ['key1' => 14, 'key2' => 11], ['key1' => 14, 'key2' => 31] ]; // 第一步:用序列化后的子数组作为键,自动去重 $temp = []; foreach ($originalArray as $item) { $temp[serialize($item)] = $item; } // 第二步:取出值并重置索引(可选,如果你想要连续的数字索引) $uniqueArray = array_values($temp); // 输出结果 print_r($uniqueArray);
这个方法的优点是简单粗暴,适配大多数普通多维数组场景,像你这种子数组都是基础数值的情况完全没问题。唯一要注意的是,如果子数组里包含对象、资源这类特殊类型,序列化可能会有问题,但你的场景不用考虑这个。
方法二:一行代码搞定的简化写法
如果你喜欢简洁的写法,可以用array_map配合array_unique来实现,原理和方法一一样,只是把循环换成了内置函数链式调用:
// 用serialize的版本 $uniqueArray = array_values(array_map('unserialize', array_unique(array_map('serialize', $originalArray)))); // 或者用json_encode/json_decode的版本,效果差不多 $uniqueArray = array_values(array_map('json_decode', array_unique(array_map('json_encode', $originalArray))));
一行代码就能完成去重+重置索引,非常适合快速开发,两种写法的区别不大,选你看着顺眼的就行。
方法三:自定义判断逻辑(适合复杂场景)
如果你以后需要更灵活的去重规则(比如只根据key1去重,或者其他复杂判断),可以自己写嵌套循环来手动检查:
$uniqueArray = []; foreach ($originalArray as $currentItem) { $isDuplicate = false; // 遍历已经去重的数组,检查当前子数组是否存在 foreach ($uniqueArray as $existingItem) { // 这里可以自定义判断条件,比如只比较key1的话就改这里 if ($existingItem['key1'] === $currentItem['key1'] && $existingItem['key2'] === $currentItem['key2']) { $isDuplicate = true; break; } } // 如果不是重复项,就加入结果数组 if (!$isDuplicate) { $uniqueArray[] = $currentItem; } } print_r($uniqueArray);
这个方法的优点是灵活性拉满,不管以后需求怎么变,改一下判断条件就行。缺点是嵌套循环,数据量特别大的时候效率会低一点,但你的数组规模很小,完全不用担心。
以上三个方法都能帮你得到想要的结果,根据自己的习惯和场景选就行~
内容的提问来源于stack exchange,提问作者webdev
相关产品推荐
相关产品推荐

