PHP如何移除数组中元素顺序不同的重复子数组?
PHP中实现元素组合唯一的数组去重
问题原因
你用array_unique($array, SORT_REGULAR)没效果,是因为这个方法会严格按照数组的元素顺序判定重复。像[2,48]和[48,2]这种元素相同但顺序不同的子数组,会被当成两个不同元素,所以去重失败。
解决方案
要实现“元素组合唯一”的去重,核心是把每个子数组的元素统一顺序,生成唯一标识,再通过标识过滤重复项。下面是两种可行的实现方式:
方式一:遍历数组,手动记录已出现的组合
这种方法可以保留原数组中第一次出现的子数组及其索引:
$originalArray = [[2,48],[48,2],[19,31],[31,19]]; $uniqueArray = []; $seen = []; foreach ($originalArray as $index => $subArray) { // 复制子数组并排序,统一元素顺序 $temp = $subArray; sort($temp); // 生成唯一标识(用逗号拼接成字符串) $key = implode(',', $temp); if (!isset($seen[$key])) { $seen[$key] = true; // 保留原数组的索引和子数组 $uniqueArray[$index] = $subArray; } } print_r($uniqueArray);
执行后会得到和你期望一致的结果,只保留[2,48]和[19,31],且索引为原数组中的0和2。
方式二:结合array_map与序列化去重
如果不需要保留原索引,可以用更简洁的链式操作:
$originalArray = [[2,48],[48,2],[19,31],[31,19]]; // 1. 给每个子数组排序,然后序列化 $processed = array_map(function($item) { sort($item); return serialize($item); }, $originalArray); // 2. 去重 $uniqueProcessed = array_unique($processed); // 3. 反序列化回数组 $uniqueArray = array_map('unserialize', $uniqueProcessed); print_r($uniqueArray);
这种方法会得到索引重置后的唯一数组,元素组合同样符合要求。
内容的提问来源于stack exchange,提问作者user1951441
相关产品推荐
相关产品推荐

