按数字键合并多数组并去除子数组重复元素的技术实现问题
问题:按数字ID键合并数组并去重子数组元素
需求说明
- 存在多个带数字键(ID,需保持数值类型,不能转为字符串)的数组
- 按数字键分组合并所有数组的值
- 子数组中需去除重复元素
初始输入数组
$arrays = [ [ 77 => [ 'Bold Condensed', 'Bold Condensed 2', 'Bold Condensed 3' ] ], [ 77 => ['Bold Condensed'], 136 => ['Regular'] ], [ 77 => ['Bold Condensed (1, 2, 3)'], 168 => ['Regular', 'Bold'] ] ];
期望输出
Array ( [77] => Array ( [0] => Bold Condensed [1] => Bold Condensed 2 [2] => Bold Condensed 3 [3] => Bold Condensed (1, 2, 3) ) [136] => Array ( [0] => Regular ) [168] => Array ( [0] => Regular [1] => Bold ) )
尝试的方法及问题
尝试使用array_merge和array_merge_recursive实现,代码如下:
$megaArray = []; foreach( $arrays as $key => $value) { if(array_key_exists($key, $arrays)){ $megaArray[$key] = array_merge_recursive($value); } }
但结果仅保留了每个ID键对应的最新子数组,无法合并所有元素并去重,不符合需求。
解决方案
通过嵌套循环遍历每个数组的ID键,合并子数组元素后去重,同时确保ID保持数值类型:
$megaArray = []; foreach ($arrays as $array) { foreach ($array as $id => $items) { // 强制转换为整数,确保ID保持数值类型 $id = (int)$id; if (!isset($megaArray[$id])) { $megaArray[$id] = []; } // 合并当前子数组元素 $megaArray[$id] = array_merge($megaArray[$id], $items); // 去重并重新索引数组,保持元素顺序 $megaArray[$id] = array_values(array_unique($megaArray[$id])); } }
代码逻辑说明
- 外层循环遍历所有输入的数组
- 内层循环遍历每个数组中的ID键及其对应的子元素数组
- 使用
(int)$id确保ID始终为数值类型,避免被转为字符串 - 用
array_merge将当前子数组的元素合并到结果数组的对应ID下 - 调用
array_unique去除重复元素,再用array_values重新索引,保证子数组是连续的数字索引
内容的提问来源于stack exchange,提问作者ilariaroglieri
相关产品推荐
相关产品推荐

