PHP数组合并需求:按r_sid、c_id合并及d_id特殊场景处理
PHP 数组按规则合并的解决方案
我明白你遇到的这个数组合并问题确实没法直接用现成的数组函数一步搞定,因为规则里有特殊场景需要额外处理。先帮你梳理下核心需求,再给出具体的实现代码:
需求回顾
你需要处理的原始数组:
$originalArray = [ ['r_id' => 11, 'r_sid' => 'RC', 'd_id' => 2], ['r_id' => 7, 'r_sid' => 'RC', 'c_id' => 51], ['r_id' => 6, 'r_sid' => 'JN', 'c_id' => 52], ['r_id' => 7, 'r_sid' => 'JN', 'c_id' => 51], ['r_id' => 7, 'r_sid' => 'LG', 'c_id' => 51], ['r_id' => 7, 'r_sid' => 'BN', 'c_id' => 51], ['r_id' => 6, 'r_sid' => 'IVS', 'c_id' => 52], ['r_id' => 7, 'r_sid' => 'IVS', 'c_id' => 51], ];
合并规则:
- 优先按**相同的
r_sid和c_id**合并; - 特殊场景:如果数组包含
d_id而不是c_id,要把它和**所有同r_sid**的数组合并; - 丢弃没有匹配项的
r_sid值(比如示例里的LG、BN就因为没有同组匹配被丢弃)。
实现代码
这里我们需要手动遍历处理,结合分组逻辑来实现:
// 第一步:先分组,同时标记带d_id的项 $groups = []; $dIdItems = []; foreach ($originalArray as $item) { // 处理带d_id的特殊项 if (isset($item['d_id']) && !isset($item['c_id'])) { $dIdItems[$item['r_sid']] = $item; continue; } // 按r_sid + c_id作为分组键,归集普通项 $key = $item['r_sid'] . '_' . $item['c_id']; if (!isset($groups[$key])) { $groups[$key] = [ 'r_id' => [], 'r_sid' => $item['r_sid'], 'c_id' => $item['c_id'] ]; } $groups[$key]['r_id'][] = $item['r_id']; } // 第二步:把带d_id的项合并到对应r_sid的所有分组中 foreach ($dIdItems as $sid => $dItem) { foreach ($groups as &$group) { if ($group['r_sid'] === $sid) { $group['d_id'] = $dItem['d_id']; $group['r_id'][] = $dItem['r_id']; } } } // 第三步:按c_id跨sid合并,整理成最终格式 $result = []; $tempResult = []; foreach ($groups as $group) { $cKey = $group['c_id']; if (!isset($tempResult[$cKey])) { $tempResult[$cKey] = [ 'r_id' => [], 'r_sid' => [], 'c_id' => [] ]; // 保留d_id(如果当前分组有) if (isset($group['d_id'])) { $tempResult[$cKey]['d_id'] = $group['d_id']; } } // 归集各类值并去重 $tempResult[$cKey]['r_id'] = array_merge($tempResult[$cKey]['r_id'], $group['r_id']); $tempResult[$cKey]['r_sid'][] = $group['r_sid']; $tempResult[$cKey]['c_id'][] = $group['c_id']; } // 格式化最终输出的字符串格式 foreach ($tempResult as $item) { $formattedItem = [ 'r_id' => implode(',', array_unique($item['r_id'])), 'r_sid' => implode(', ', array_unique($item['r_sid'])), 'c_id' => implode(',', array_unique($item['c_id'])), ]; // 仅当存在d_id时添加 if (isset($item['d_id'])) { $formattedItem['d_id'] = $item['d_id']; } $result[] = $formattedItem; } print_r($result);
代码解释
- 分组阶段:先把普通项按
r_sid+c_id维度分组,同时单独收集带d_id的特殊项; - 合并特殊项:遍历所有带
d_id的项,把它们合并到对应r_sid的所有分组中; - 跨维度合并:最后按
c_id把不同r_sid的分组再合并,将数组值转成逗号分隔的字符串格式; - 最终处理后会自动丢弃无匹配的
r_sid(比如LG、BN对应的分组因为没有同c_id的其他项,不会进入最终结果)。
运行这段代码后,输出结果就会和你期望的一致:
Array ( [0] => Array ( [r_id] => 11,7 [r_sid] => RC [c_id] => 51 [d_id] => 2 ) [1] => Array ( [r_id] => 6,7 [r_sid] => JN, IVS [c_id] => 52,51 ) )
内容的提问来源于stack exchange,提问作者user7616631
相关产品推荐
相关产品推荐

