【问题标题】:Compare nested arrays比较嵌套数组
【发布时间】:2017-01-25 09:44:42
【问题描述】:

我有这些数组,第一个代表问卷中用户给出的答案,第二个代表每个问卷的正确答案:

$given_answers => array(3) {
  [46] => string(2) "82" 
  [47] => string(2) "86"
  [48] => array(2) {
    [0] => string(2) "88" // key is not questionID here
    [1] => string(2) "89"  // key is not questionID here
  }
}

$correct_answers => array(3) {
  [46] => int(84)
  [47] => int(86)
  [48] => array(2) {
    [0] => int(88) // key is not questionID here
    [1] => int(91) // key is not questionID here
  }
}

注意:两个数组中的每个键都代表 questionID,除了我在 cmets 中提到的这些。因此,例如 questionID 46 的 answerID 为 84 作为正确答案,questionID 48 的正确答案为 88 和 91,因此键 0、1 在这种情况下是简单的数组索引。

我要做的是比较两个数组并检查答案是否 (questionID) 匹配每个 questionID。我怎样才能做到这一点?我尝试使用array_diff(),但出现错误

$result = array_diff($correct_answers, $given_answers);

Severity: Notice

Message: Array to string conversion

【问题讨论】:

  • 最终的数组/结果应该如何?
  • 我试图做的逻辑是所有答案都应该完全匹配正确的答案,所以如果我有一个错误,我就有一个错误(即未能通过问卷),所以如果我有一系列错误答案或只是一个false,这并不重要

标签: php arrays compare


【解决方案1】:

所有答案都应该完全匹配正确的,所以如果我有 连一个错我都有错

使用以下方法:

$given_answers = [
    46=> "82",
    47=> "86",
    48=> ["88", "89"],
];

$correct_answers = [
    46=> "84",
    47=> "86",
    48=> ["88", "91"],
];

$all_matched = true;
foreach ($given_answers as $k => $ans) {
    if (!is_array($ans)) {
        if ($correct_answers[$k] != $ans) {  // comparing primitive values 
            $all_matched = false;
            break;
        }
    } else {
        // comparing arrays for equality
        if (!empty(array_diff($ans, $correct_answers[$k]))) {
            $all_matched = false;
            break;
        }
    }
}

var_dump($all_matched);  // false

【讨论】:

    【解决方案2】:

    更好的方法是递归调用 array_diff 函数,如下所示,

    $array = array(
        46=>86,
        47=>86,
        48 => [
            0=> 88,
            1 => 89
            ]
    );
    $array1 = [
        46 => 64,
        47 => 86,
        48 => [
            0 => 88,
            1 => 91
            ]
        ];
    function array_diff_assoc_recursive($array1, $array2)
    {
        $difference = array();
        foreach ($array1 as $key => $value) {
            if (is_array($value)) {
                if (!isset($array2[$key]) || !is_array($array2[$key])) {
                    $difference[$key] = $value;
                } else {
                    $new_diff = array_diff_assoc_recursive($value, $array2[$key]);
                    if (!empty($new_diff)) {
                        $difference[$key] = $new_diff;
                    }
    
                }
            } else if (!array_key_exists($key, $array2) || $array2[$key] !== $value) {
                $difference[$key] = $value;
            }
        }
        return $difference;
    }           
    
    $arr = array_diff_assoc_recursive($array,$array1);
    print_r($arr);
    

    希望这能解决你的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-19
      • 1970-01-01
      • 2020-01-17
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多