Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> phpunit assertEquals dla 2 tablic tak, że kolejność elementów tablic nie gra roli.
trzczy
post 17.09.2016, 22:54:53
Post #1





Grupa: Zarejestrowani
Postów: 460
Pomógł: 49
Dołączył: 5.06.2011

Ostrzeżenie: (0%)
-----


Chodzi mi o porównywanie dwóch tablic w phpunit. Ale wynik ma być pozytywny, gdy tablice mają te same elementy, a kolejność tych elementów jest taka sama lub inna. Czyli tablice mają być traktowane jak takie zbiory, w których kolejności nie ma. W matematyce to się nazywa zbiorem w odróżnieniu od ciągu.

Czy to rozwiązanie jest ok, czy istnieją jakieś lepsze udokumentowane sposoby? http://stackoverflow.com/a/28189403/5673289
Z góry dziękuję
Go to the top of the page
+Quote Post
kpt_lucek
post 18.09.2016, 01:11:54
Post #2





Grupa: Zarejestrowani
Postów: 428
Pomógł: 77
Dołączył: 10.07.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


  1. public function arraysEqual(array $array1, array $array2) {
  2. $diff = array_diff(array_values($array1), array_values($array2));
  3.  
  4. return 0 === count($diff);
  5. }


(z palca)

Ten post edytował kpt_lucek 18.09.2016, 01:12:41


--------------------


Cytat
There is a Bundle for that
Lukas Kahwe Smith - October 31th, 2014
Go to the top of the page
+Quote Post
trzczy
post 18.09.2016, 10:42:18
Post #3





Grupa: Zarejestrowani
Postów: 460
Pomógł: 49
Dołączył: 5.06.2011

Ostrzeżenie: (0%)
-----


Dziękuje za odpowiedź, @kpt_lucek. Trzeba sprawdzić array_diff w obie strony, czyli array_diff($a, $b) oraz array_diff($b, $a). Oba wyniki mają dawać pusta tablicę.

Ale mnie zastanawia, czy dla TDD lepiej jest pisać taką funkcję porównania, czy lepiej stosować nieudokumentowany parametr $canonicalize.
Go to the top of the page
+Quote Post
kpt_lucek
post 18.09.2016, 17:10:05
Post #4





Grupa: Zarejestrowani
Postów: 428
Pomógł: 77
Dołączył: 10.07.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


  1. $values1 = array_values($array1);
  2. $values2 = array_values($array2);
  3.  
  4. self::assertEquals(array_diff($values1, $values2), array_diff($values2, $values1)); // tak chyba było


I nigdzie nie widzę problemu takiego użycia.

Przy okazji, gdy chcesz sprawdzić czy pod danym kluczem znajduje się ta sama wartość w obu tablicach to możesz zrobić to tak:
  1. $array1 == $array2;


Gdy przy okazji chcesz sprawdzić kolejność kluczy, wraz z typami wartości, to robisz to tak:
  1. $array1 === $array2;


Ogólnie, to nie potrzebnie sobie życie utrudniasz smile.gif

(z palca)

Ten post edytował kpt_lucek 18.09.2016, 17:10:21


--------------------


Cytat
There is a Bundle for that
Lukas Kahwe Smith - October 31th, 2014
Go to the top of the page
+Quote Post
trzczy
post 20.09.2016, 03:24:44
Post #5





Grupa: Zarejestrowani
Postów: 460
Pomógł: 49
Dołączył: 5.06.2011

Ostrzeżenie: (0%)
-----


Napisałem taką funkcję:
  1. function arraysExtendedIdentity($array1, $array2)
  2. {
  3. {
  4. if (count($array1) !== count($array2)) {
  5. return false;
  6. }
  7. foreach ($array1 as $key => $value) {
  8. if (is_integer($key)) {
  9. if (!in_array($value, $array2)) {
  10. return false;
  11. }
  12. } else {
  13. if (!key_exists($key, $array2) or ($value !== $array2[$key])) {
  14. return false;
  15. }
  16. }
  17. }
  18. }
  19. return true;
  20. }


Ale stosowanie nieudokumentowanego parametru $canonicalize ma pewną zaletę, mianowicie w przypadku fail wyświetla poszczególne róznice między tablicami. Przy takich pisanych ręcznie funkcjach trzeba by takie zachowanie dopisać.

Ten post edytował trzczy 20.09.2016, 03:27:09
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.03.2024 - 09:39