Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Filtrowanie tablicy.
Forum PHP.pl > Forum > Przedszkole
Yuri20
Otóż mam taki skrypcik, który ma filtrować tablicę tak, aby za każdym razem zwracała najwyższy wynik, ale za każdym przebiegiem pętli ma wyłączać z filtorwania wynik, który ostatnio był najwyższy.

  1. $byly = array();
  2. $top=0;$topKlucz;
  3. for($i=0;$i<count($staty);$i++){
  4. foreach($staty as $klucz=>$wartosc){
  5. if(!in_array($klucz, $byly))
  6. if($wartosc['ekonomia'] > $top){
  7. $top = $wartosc['ekonomia'];
  8. $topKlucz = $klucz;
  9.  
  10. }
  11. }
  12. $byly[] = $topKlucz;
  13. }


Niestety powyższy skrypt za każdy razem zwraca ten sam wynik jako najwyższy (3 razy, ponieważ pętla for przebiega 3 razy).
maniana
Więc usuń pętle for smile.gif
A tak to może lepiej użyć MAX?
  1. $max = max( $array ); // Dla wartości
  2. $max_key = max( array_keys( $array ) ); // Dla kluczy
Yuri20
Nie mogę usunąć pętli for, ponieważ chcę aby pętla foreach za każdym razem zwracała inny wynik najwyższy (maksymalnie mało mniejszy od ostatniego), a tymczasem zwracany jest cały czas ten sam wynik, ponieważ jakoś in_array zawodzi. Gdyby działał jak trzeba, to wynik ostatnio sprawdzony byłby wykluczany.... :<

EDIT:
Na potrzeby przenalizowania co jest nie tak, skróciłem kod do takiej formy:

  1. for($i=0;$i<count($staty);$i++){
  2.  
  3. foreach($staty as $klucz=>$wartosc){
  4. if($wartosc['ekonomia'] > $top){
  5. $top = $wartosc['ekonomia'];
  6. $topKlucz = $klucz;
  7. echo $top;
  8.  
  9. }
  10. }
  11. $staty[$topKlucz]['ekonomia'] = null;
  12.  
  13. }


Czyli po pierwszym foreachu wyprowadzana jest najwyższa wartość w pierwszym przebiegu pętli for. Dlatego ustalam $staty[$topKlucza]['ekonomia'] na null, żeby przy najstępnym foreachu już ta wartośc nie była sprawdzana. A co się dzieje? Kolejne dwa foreache praktycznie nie działają, i zwracany jest najwyższy wynik po pierwszym foreachu, a potem nic. Tablica $staty wygląda tak:

$staty = array(25,0,2).
maniana
Nie wiem czy dobrze zrozumiałem, chcesz wyświetlić X tam największych liczb? Jeśli tak to wystarczy:
  1. $staty = array(25,0,2,43,6,82,31,73,12);
  2. sort($staty);
  3. print_r(array_slice($staty, 0, 3));
A jeśli w pętli to:
  1. $staty = array(25,0,2,43,6,82,31,73,12);
  2.  
  3. $max = array();
  4. for($i=0;$i<count($staty);$i++){
  5. $top = 0;
  6. foreach($staty as $klucz=>$wartosc){
  7. if($wartosc > $top){
  8. $top = $wartosc;
  9. $topKlucz = $klucz;
  10. }
  11. }
  12. echo $top.'<br />';
  13. $max[$topKlucz] = $top;
  14. unset($staty[$topKlucz]);
  15. }
  16. print_r($max);

Zauważ, że w swoim kodzie operujesz na danych które przetwarzasz i cały czas sprawdzasz czy liczby nie są większe od znalezionej największej liczby w pierwszym przejściu pętli. $top zawsze będzie największa bo jej nie zerujesz przed dalszym wyszukiwaniem.
Yuri20
Dokładnie o to mi chodzi. Zmienna $top nie była zerowana i to była przyczyna problemu. Dziękuje wink.gif
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.