PHP多维数组按共享id键合并:仅返回1组结果的问题解决
按ID键合并PHP数组中的同类项
你现在遇到的问题是原代码只是把所有子数组无差别地合并成一个数组,后面的子数组会覆盖前面相同键的值(比如fghij的height覆盖了abcde的),而且没有按id分组。我们需要修改逻辑,以id的值作为新数组的键,把相同id的子数组合并到对应的分组里。
修正后的代码
$new_new = []; foreach($orig as $item) { if (is_array($item) && isset($item['id'])) { $id = $item['id']; // 如果这个id的分组还不存在,先初始化 if (!isset($new_new[$id])) { $new_new[$id] = []; } // 合并当前项到对应id的分组中 $new_new[$id] = array_merge($new_new[$id], $item); } } // 如果需要把键名改成数字索引(比如去掉abcde、fghij作为键),可以再加一步: // $new_new = array_values($new_new);
代码解释
- 我们以每个子数组的
id值作为$new_new的键,这样相同id的项会被归到同一组里。 - 每次循环先检查当前
id的分组是否存在,不存在就初始化一个空数组。 - 用
array_merge把当前子数组合并到对应分组,这样相同字段会被后续的项覆盖(比如abcde的field19最后会保留AZ,符合你原结果里的情况)。
正确的输出结果
运行上面的代码后,$new_new会变成:
Array ( [abcde] => Array ( [id] => abcde [field2] => height [value2] => 40 ft. [field3] => width [value3] => 10-15 ft. [field4] => light [value4] => Full - Partial [field6] => space [value6] => 5-6 ft. [field19] => restricted [value19] => AZ ) [fghij] => Array ( [id] => fghij [field2] => height [value2] => 4-8 ft. [field3] => width [value3] => 3-4 ft. [field4] => light [value4] => Full - Partial [field5] => season [value5] => Spring [field6] => space [value6] => 4 ft. [field19] => restricted [value19] => CA, TX, LA, FL, AZ ) )
如果不需要用id作为键,而是想得到数字索引的数组,就加上注释里的array_values($new_new),结果会变成:
Array ( [0] => Array ( [id] => abcde ... // 其他字段同上面的abcde组 ) [1] => Array ( [id] => fghij ... // 其他字段同上面的fghij组 ) )
原代码的问题
你原来的代码$new_new = array_merge($new_new, $value);每次都把当前子数组合并到同一个空数组里,后面的子数组会覆盖前面相同键的内容(比如fghij的height覆盖了abcde的height),最后只会得到一个包含所有字段但被最后覆盖后的数组,自然丢失了fghij的独立分组。
内容的提问来源于stack exchange,提问作者mezzomix
相关产品推荐
相关产品推荐

