使用array_merge合并数组时重复项被移除的问题咨询
解决PHP多数组合并时重复键覆盖的问题
我看你现在用array_merge()合并多个数组,但应该发现了:对于字符串类型的键名,array_merge()会用后续数组的键值直接覆盖前面的——就像你代码里的key1和key2,最后只保留了最后一次合并的结果。下面给你几种不同需求下的解决方案:
1. 保留所有相同键的多维合并
如果你想把相同键下的子数组都保留下来(形成多维数组),可以用array_merge_recursive(),它会自动把相同字符串键的内容合并成一个数组:
$arr1 = array("key1" => array("10","12")); $arr2 = array("key2" => array("1","11")); $arr3 = array("key1" => array("10","12")); $arr4 = array("key2" => array("1","11")); $res = array_merge_recursive($arr1, $arr2, $arr3, $arr4); print_r($res);
输出结果:
Array ( [key1] => Array ( [0] => Array ( [0] => 10 [1] => 12 ) [1] => Array ( [0] => 10 [1] => 12 ) ) [key2] => Array ( [0] => Array ( [0] => 1 [1] => 11 ) [1] => Array ( [0] => 1 [1] => 11 ) ) )
2. 合并相同键的子数组为一维(可选去重)
如果你的需求是把相同键下的所有值合并成一个一维数组,甚至去掉重复值,那可以写个自定义循环来处理:
$arrays = [$arr1, $arr2, $arr3, $arr4]; $res = []; foreach ($arrays as $arr) { foreach ($arr as $key => $values) { // 如果键不存在,先初始化空数组 if (!isset($res[$key])) { $res[$key] = []; } // 合并子数组并去重 $res[$key] = array_unique(array_merge($res[$key], $values)); } } print_r($res);
输出结果(因为原数据没有重复值,所以和你原来的输出一致,但如果有重复值会自动去重):
Array ( [key1] => Array ( [0] => 10 [1] => 12 ) [key2] => Array ( [0] => 1 [1] => 11 ) )
3. 保留首次出现的键值(不被后续覆盖)
如果你只想保留每个键第一次出现的内容,后续相同键的内容不覆盖它,可以用数组联合运算符+:
$res = $arr1 + $arr2 + $arr3 + $arr4; print_r($res);
输出结果和你原来用array_merge()的结果一样,但逻辑是保留左侧(先出现)的键值,右侧相同键会被忽略。
内容的提问来源于stack exchange,提问作者Carol.Kar
相关产品推荐
相关产品推荐

