PHP中如何对比两个多维数组并生成自定义结构的结果数组
修正PHP多维数组对比代码,实现自定义规则输出
首先咱们先聊聊原代码的问题:
- 循环
$array2时,每遇到一个不匹配的班级就会执行else分支,导致同一个班级的结果被重复添加多次 - 遗漏了班级级别的
ischeck字段设置 - 逻辑嵌套混乱,反复遍历
$array2导致效率偏低
我调整了思路,先把$array2转成以班级名为键的关联数组,这样查找班级和对应科目会高效很多,再逐个处理$array1里的内容:
// 先将array2转换为以班级名为键的映射数组,方便快速查找 $array2Map = []; foreach ($array2 as $item) { $className = $item['class']; $array2Map[$className] = $item['subjects']; } $full_array = []; foreach ($array1 as $classItem) { $className = $classItem['class']; // 判断当前班级是否在array2中存在,设置班级的ischeck状态 $classIsCheck = isset($array2Map[$className]) ? 'Yes' : 'No'; $subs = []; // 遍历当前班级的所有科目,逐个设置ischeck foreach ($classItem['subjects'] as $subject) { $subIsCheck = 'No'; // 只有班级存在时,才需要判断科目是否在对应列表中 if ($classIsCheck === 'Yes') { if (in_array($subject, $array2Map[$className])) { $subIsCheck = 'Yes'; } } $subs[] = [ 'subjects' => $subject, 'ischeck' => $subIsCheck ]; } // 组装当前班级的结果并加入最终数组 $full_array[] = [ 'classname' => $className, 'ischeck' => $classIsCheck, 'subs' => $subs ]; } // 打印验证结果 print_r($full_array);
代码逻辑说明:
- 构建映射数组:把
$array2转成[班级名 => 对应科目数组]的结构,后续查找班级和科目只需O(1)时间,避免重复遍历$array2 - 处理班级状态:遍历
$array1的每个班级,直接通过映射数组判断是否存在,设置班级的ischeck - 处理科目状态:针对每个科目,只有当班级存在时,才去对应科目列表里匹配,设置科目的
ischeck - 组装结果:按照你要求的格式,把班级信息、状态、科目列表整合后加入最终数组
这样运行出来的结果完全符合你的规则:存在的班级标记Yes,不存在的标记No;对应班级里存在的科目标记Yes,否则No。
内容的提问来源于stack exchange,提问作者satya
相关产品推荐
相关产品推荐

