Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Porównanie dwóch tablic
Forum PHP.pl > Forum > Przedszkole
arzach
Witam mam taki kod
  1. $aktualna_kolejka[] = array('druzyna_name' => 'Polonia Warszawa');
  2. $aktualna_kolejka[] = array('druzyna_name' => 'Jagiellonia Bialystok');
  3. $aktualna_kolejka[] = array('druzyna_name' => 'GKS Belchatow');
  4. $aktualna_kolejka[] = array('druzyna_name' => 'Wisla Krakow');
  5.  
  6.  
  7. $poprzednia_kolejka[] = array('druzyna_name' => 'Polonia Warszawa');
  8. $poprzednia_kolejka[] = array('druzyna_name' => 'Jagiellonia Bialystok');
  9. $poprzednia_kolejka[] = array('druzyna_name' => 'Wisla Krakow');
  10. $poprzednia_kolejka[] = array('druzyna_name' => 'GKS Belchatow');
  11.  
  12.  
  13. function comparison_array(array $array, $druzyna_name){
  14.  
  15. foreach($array as $key => $value){
  16. if($druzyna_name == $value['druzyna_name']){
  17.  
  18. return 'bez zmian';
  19.  
  20. } elseif($druzyna_name > $value['druzyna_name']){
  21. return 'awans';
  22. } else {
  23. return 'spadek';
  24. }
  25. }
  26.  
  27. }
  28.  
  29.  
  30. // wyświetlanie wyników
  31. foreach($aktualna_kolejka AS $value){
  32. echo comparison_array($poprzednia_kolejka, $value['druzyna_name'])." | ".$value['druzyna_name'].'</br>';
  33. // bez zmian | Polonia Warszawa
  34. // bez zmian | Jagiellonia Bialystok
  35. // awans | GKS Belchatow
  36. // spadek | Wisla Krakow
  37. }


Oczywiście kod ten nie działa i potrzebuje pomoc w napisaniu funkcji która porówna $aktualna_kolejka z tablicą $poprzednia_kolejka tak by funkcja zwracała

- bez zmian gdy drużyna w tablicy $aktualna_kolejka jest na tej same pozycji co w $poprzednia_kolejka
- awans gdy drużyna w tablicy $aktualna_kolejka jest wyżej niż w tablicy $poprzednia_kolejka
- spadek gdy drużyna w tablicy $aktualna_kolejka jest niżej niż w tablicy $poprzednia_kolejka

Proszę o pomoc w napisaniu tego w jak najprostszy sposób. Sprawa się komplikuje dla mnie ponieważ klucze w tablicach są indeksowane numerycznie zamiast nazwy drużyn.
lobopol
Na diabła
  1. $aktualna_kolejka[] = array('druzyna_name' => 'Polonia Warszawa');
  2. $aktualna_kolejka[] = array('druzyna_name' => 'Jagiellonia Bialystok');
  3. $aktualna_kolejka[] = array('druzyna_name' => 'GKS Belchatow');
  4. $aktualna_kolejka[] = array('druzyna_name' => 'Wisla Krakow');

Lepiej
  1. $aktualna_kolejka[] = 'Polonia Warszawa';
  2. $aktualna_kolejka[] = 'Jagiellonia Bialystok';
  3. $aktualna_kolejka[] = 'GKS Belchatow';
  4. $aktualna_kolejka[] = 'Wisla Krakow';

i analogicznie z drugą tablicą
  1. function comparison_array($array_new, $array_old, $druzyna_name){
  2.  
  3. foreach($array_old as $key => $value){
  4. if($drużyna_name == $value){
  5. $position_old = $key;
  6. }
  7. }
  8.  
  9. foreach($array_new as $key => $value){
  10. if($drużyna_name == $value){
  11. $position_new = $key;
  12. }
  13. }
  14. if($position_new == $position_old)
  15. return 'same';
  16. } //reszte dopisz sobie sam


Można by to nieco wydajniej zrobić, ale nie mam teraz weny do kombinowania
arzach
Nie mogę zmienić tablicy na jedno wymiarową ponieważ potrzebuje Tablice wielowymiarowe bo w tablicy oprócz nazwy drużyny są jeszcze informacje o zdobytych punktach bramkach itp
  1. $aktualna_kolejka[] = array('druzyna_name' => 'Polonia Warszawa', 'punkty' => 9);
  2. $aktualna_kolejka[] = array('druzyna_name' => 'Jagiellonia Bialystok', 'punkty' => 9);
  3. $aktualna_kolejka[] = array('druzyna_name' => 'GKS Belchatow', 'punkty' => 7);
  4. $aktualna_kolejka[] = array('druzyna_name' => 'Wisla Krakow', 'punkty' => 5);


Cytat(lobopol @ 30.07.2011, 21:15:55 ) *
  1. function comparison_array($array_new, $array_old, $druzyna_name){
  2.  
  3. foreach($array_old as $key => $value){
  4. if($drużyna_name == $value){
  5. $position_old = $key;
  6. }
  7. }
  8.  
  9. foreach($array_new as $key => $value){
  10. if($drużyna_name == $value){
  11. $position_new = $key;
  12. }
  13. }
  14. if($position_new == $position_old)
  15. return 'same';
  16. } //reszte dopisz sobie sam


Można by to nieco wydajniej zrobić, ale nie mam teraz weny do kombinowania


To co podałeś można zrobić jedną pętlą w funkcji tylko nie wiem jak. Do funkcji wystarczy przekazać jako argument $poprzednia_kolejka, $druzyna_name po co dwie tablice ?

Chodzi mi o coś takiego
  1. // wyświetlanie wyników
  2. foreach($aktualna_kolejka AS $value){
  3. echo comparison_array($poprzednia_kolejka, $value['druzyna_name'])." | ".$value['druzyna_name'].'</br>';
  4. // bez zmian | Polonia Warszawa
  5. // bez zmian | Jagiellonia Bialystok
  6. // awans | GKS Belchatow
  7. // spadek | Wisla Krakow
  8. }
  9.  




Pomoże ktoś jak można napisać najprościej taką funkcje ?
lobopol
Po to dwie tablicę aby sprawdzić starą i nową pozycje proste.
Jedną pętlą to :
  1. foreach($array_old as $key => $value){
  2. if($drużyna_name == $value){
  3. $position_old = $key;
  4. }
  5. if($array_new[$key] == $druzyna_name){
  6. $position_new = $key;
  7. }
  8. }

i wywalamy drugą pętle, reszta bez zmian

Inna opcja jak mi do głowy wpadła:
  1. $position_old = array_search ( $druzyna_name , $array_old);
  2. $position_new = array_search ( $druzyna_name , $array_new);

Zamiast pętli w funkcji, reszta bez zmian
lobopol
Mógłbyś nie kantować? Przed chwilą sprawdziłem kod działa najpierw dokładnie przepisz i pomyśl
  1. $aktualna_kolejka[] = 'Polonia Warszawa';
  2. $aktualna_kolejka[] = 'Jagiellonia Bialystok';
  3. $aktualna_kolejka[] = 'GKS Belchatow';
  4. $aktualna_kolejka[] = 'Wisla Krakow';
  5.  
  6. $stara_kolejka[] = 'Polonia Warszawa';
  7. $stara_kolejka[] = 'Jagiellonia Bialystok';
  8. $stara_kolejka[] = 'Wisla Krakow';
  9. $stara_kolejka[] = 'GKS Belchatow';
  10.  
  11. function comparison_array($array_new, $array_old, $druzyna_name){
  12. $position_old = array_search ( $druzyna_name , $array_old);
  13. $position_new = array_search ( $druzyna_name , $array_new);
  14. if($position_new == $position_old){
  15. return 'same';
  16. }elseif($position_new > $position_old){
  17. return 'up';
  18. }else{
  19. return 'down';
  20. }
  21. }
  22.  
  23. foreach($aktualna_kolejka as $value){
  24. echo comparison_array($aktualna_kolejka, $stara_kolejka, $value)." | ".$value.'<br/>';
  25. }


Wynik:
same | Polonia Warszawa
same | Jagiellonia Bialystok
down | GKS Belchatow
up | Wisla Krakow
arzach
Przecież napisałem że nie mogę tablic zmieniać i że muszę mieć taką tablice

  1. $aktualna_kolejka[] = array('druzyna_name' => 'Polonia Warszawa', 'punkty' => 9);
  2. $aktualna_kolejka[] = array('druzyna_name' => 'Jagiellonia Bialystok', 'punkty' => 9);
  3. $aktualna_kolejka[] = array('druzyna_name' => 'GKS Belchatow', 'punkty' => 7);
  4. $aktualna_kolejka[] = array('druzyna_name' => 'Wisla Krakow', 'punkty' => 5);


Ale udało mi się i rozwiązałem to tak

  1. function comparison_array($poprzednia_kolejka, $druzyna_name, $key_druzyna){
  2. foreach($poprzednia_kolejka AS $key => $value){
  3. if($value['druzyna_name'] == $druzyna_name){
  4.  
  5. if($key == $key_druzyna){
  6. return 'bez zmian';
  7. } elseif($key > $key_druzyna){
  8. return 'spadek';
  9. } else {
  10. return 'awans';
  11. }
  12.  
  13. }
  14. }
  15. }
  16.  
  17. foreach($aktualna_kolejka AS $key => $value){
  18. echo comparison_array($poprzednia_kolejka, $value['druzyna_name'], $key).'</br>';
  19. }


Nie wiem czy da się prościej ale działa.
lobopol
Przy wielowymiarowej to twój sposób może być, wybacz nie zauważyłem, że nie możesz zmieniać układu tablicy.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.