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

PHP使用array_combine合并数组对比答题结果的问题排查与修正

PHP 答案对比代码的问题修复

问题场景

现有正确答案数组和用户答案数组,原代码尝试用array_combine合并后对比,但出现以下问题:

  • 第4题判断错误(实际应为true)
  • 第5、6题结果未显示
  • 统计对错数量时抛出count(): Argument must be of type Countable错误

原代码:

$i=1;
$correct = array('a','d','c','a','b','c');
$user    = array('a','c','c','a','c','c');

foreach (array_combine($correct, $user) as $co => $ur) {
    if($co == $ur) {
        echo $i.':true <br>';
    } else {
        echo $i.':false <br>';
    }
    $i++;
}
echo 'True: '.count($co == $ur);
echo 'False: '.count($co == $ur);

实际输出:

1:true
2:false
3:true
4:false
Error: count(): Argument must be of type Countable...

期望输出:

1: true
2: false
3: true
4: true
5: false
6: true

True: 4
False: 2

错误原因分析

  1. array_combine的局限性:该函数要求第一个数组的元素作为键,且键必须唯一。正确答案数组中有重复值(如'a'出现2次,'c'出现2次),重复的键会被后面的覆盖,导致合并后的数组只有4个元素,直接跳过第5、6题的对比,同时第4题的对比逻辑也出现错误。
  2. 统计逻辑错误:$co == $ur是布尔值,count()仅能接收可数类型(数组、实现Countable接口的对象),直接对布尔值调用count()会抛出错误,且该语句只能获取最后一次循环的对比结果,无法统计总数。

修正后的代码

$correct = ['a','d','c','a','b','c'];
$user = ['a','c','c','a','c','c'];
$trueCount = 0;
$falseCount = 0;

// 通过索引遍历,同时访问两个数组的对应元素
foreach ($correct as $index => $co) {
    $ur = $user[$index];
    $isCorrect = $co === $ur;
    // 输出逐题结果
    echo ($index + 1) . ': ' . ($isCorrect ? 'true' : 'false') . '<br>';
    
    // 累加统计数量
    $isCorrect ? $trueCount++ : $falseCount++;
}

// 输出统计结果
echo '<br>True: ' . $trueCount . '<br>';
echo 'False: ' . $falseCount;

代码说明

  • 直接遍历正确答案数组的索引,通过索引匹配用户答案数组的对应元素,彻底避免array_combine的键重复问题,保证每一题都能被正确对比。
  • 初始化计数变量$trueCount和$falseCount,在循环中根据对比结果实时累加,最后输出统计值,规避count()的错误使用场景。
  • 使用严格相等===进行对比(若需要宽松匹配可改用==),逻辑更严谨。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 09:07:20