You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);

代码逻辑说明:

  1. 构建映射数组:把$array2转成[班级名 => 对应科目数组]的结构,后续查找班级和科目只需O(1)时间,避免重复遍历$array2
  2. 处理班级状态:遍历$array1的每个班级,直接通过映射数组判断是否存在,设置班级的ischeck
  3. 处理科目状态:针对每个科目,只有当班级存在时,才去对应科目列表里匹配,设置科目的ischeck
  4. 组装结果:按照你要求的格式,把班级信息、状态、科目列表整合后加入最终数组

这样运行出来的结果完全符合你的规则:存在的班级标记Yes,不存在的标记No;对应班级里存在的科目标记Yes,否则No。

内容的提问来源于stack exchange,提问作者satya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 09:29:08