Ce qui est un bon moyen pour affirmer que les deux tableaux d'objets sont égaux, où l'ordre des éléments dans le tableau est sans importance, ou même des sujets à changement?
Réponses
Trop de publicités?La façon la plus propre de le faire serait d'étendre phpunit avec une nouvelle affirmation de la méthode. Mais voici une idée pour un moyen plus simple pour l'instant. Code non testé, veuillez vérifier:
Quelque part dans votre application:
/**
* Determine if two associative arrays are similar
*
* Both arrays must have the same indexes with identical values
* without respect to key ordering
*
* @param array $a
* @param array $b
* @return bool
*/
function arrays_are_similar($a, $b) {
// if the indexes don't match, return immediately
if (count(array_diff_assoc($a, $b))) {
return false;
}
// we know that the indexes, but maybe not values, match.
// compare the values between the two arrays
foreach($a as $k => $v) {
if ($v !== $b[$k]) {
return false;
}
}
// we have identical indexes, and no unequal values
return true;
}
Dans votre test:
$this->assertTrue(arrays_are_similar($foo, $bar));
Mon problème est que j'ai 2 tableaux (array touches ne sont pas pertinentes pour moi, juste les valeurs).
Par exemple, j'ai voulu tester si
$expected = array("0" => "green", "2" => "red", "5" => "blue", "9" => "pink");
avait le même contenu (afin de ne pas pertinente pour moi)
$actual = array("0" => "pink", "1" => "green", "3" => "yellow", "red", "blue");
J'ai donc utilisé array_diff.
Résultat Final a été (si les matrices sont égales, la différence de résultat dans un tableau vide). Veuillez noter que l'écart est calculé de deux façons (Merci @béret, @GordonM)
$this->assertEmpty(array_merge(array_diff($expected, $actual), array_diff($actual, $expected)));
Pour un message d'erreur plus détaillé (en cours de débogage), vous pouvez également tester comme cela (merci @DenilsonSá):
$this->assertSame(array_diff($expected, $actual), array_diff($actual, $expected));
Ancienne version avec des bugs à l'intérieur:
$this->assertEmpty(array_diff($array2, $array1));
Simple méthode d'assistance
protected function assertEqualsArrays($expected, $actual, $message) {
$this->assertTrue(count($expected) == count(array_intersect($expected, $actual)), $message);
}
Ou si vous avez besoin de plus d'informations de débogage lorsque les tableaux ne sont pas égaux
protected function assertEqualsArrays($expected, $actual, $message) {
sort($expected);
sort($actual);
$this->assertEquals($expected, $actual, $message);
}