Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Filtrowanie tablicy.
Yuri20
post
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 13.07.2010

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


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).
Go to the top of the page
+Quote Post
maniana
post
Post #2





Grupa: Zarejestrowani
Postów: 207
Pomógł: 44
Dołączył: 18.05.2007

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


Więc usuń pętle for (IMG:style_emoticons/default/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
Go to the top of the page
+Quote Post
Yuri20
post
Post #3





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 13.07.2010

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


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).

Ten post edytował Yuri20 16.04.2012, 19:44:09
Go to the top of the page
+Quote Post
maniana
post
Post #4





Grupa: Zarejestrowani
Postów: 207
Pomógł: 44
Dołączył: 18.05.2007

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


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.
Go to the top of the page
+Quote Post
Yuri20
post
Post #5





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 13.07.2010

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


Dokładnie o to mi chodzi. Zmienna $top nie była zerowana i to była przyczyna problemu. Dziękuje (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 16.09.2025 - 06:48