2 votes

Comparer des tableaux imbriqués

J'ai ces tableaux, dont le premier représente les réponses données par un utilisateur à un questionnaire et le second les réponses correctes de chaque questionnaire :

$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
  }
}

NOTA Chaque clé dans les deux tableaux représente le questionID, à l'exception de ceux que je mentionne dans les commentaires. Ainsi, par exemple, l'ID de question 46 a l'ID de réponse 84 comme réponse correcte et l'ID de question 48 a les réponses correctes 88 et 91, donc les clés 0, 1 sont de simples index de tableau dans ce cas.

Ce que j'essaie de faire est de comparer les deux tableaux et de vérifier si les réponses (questionID) correspondent pour chaque questionID. Comment puis-je faire cela ? J'ai essayé d'utiliser array_diff() mais je reçois une erreur

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

Severity: Notice

Message: Array to string conversion

1voto

RomanPerekhrest Points 54365

toutes les réponses doivent correspondre exactement aux bonnes, donc si j'ai une seule réponse fausse, il y a une erreur

Utilisez l'approche suivante :

$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

1voto

Rahul Meshram Points 6424

Une meilleure façon de le faire est d'appeler récursivement la fonction array_diff comme ci-dessous,

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

J'espère que cela résoudra votre problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X