Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Przypisywanie przedziałom wartości słownej - tablica
pawdoh
post
Post #1





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 29.12.2010

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


Witam mam następujący problem otóż, pobieram z bazy danych wartość będącą liczbą i teraz mam problem ponieważ potrzebuję to przypisać mam kod

  1. <?php
  2. $ranga = (
  3. range(0, 3999) => 'Początkujący',
  4. range(4000, 7999) => 'Młodzian',
  5. range(8000, 11999) => 'Doświadczony',
  6. range(12000, 20000) => 'Weteran',
  7. )
  8. ?>

następnie to przypisuje w pliku do którego załączam tą tablice, $ranga[$r[rank]]. I po tym właśnie zwraca mi błąd

Warning: Illegal offset type in ... on line 3,4,5,6

Bardzo bym prosił o pomoc gdyż jestem początkującym programistą i nie wiem za bardzo gdzie zrobiłem błąd. Pozdrawiam
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Ja bym nie ufał przedziałom górnym. Kulczycki ma rację co do pewnego małego babola u Ciebie Crozin. Nie reagujesz na przekroczenie zakresu maksymalnego w ostatnim wypadku dla weterana. Gdy ktoś przekroczy 20000 - nie pokaże nic.
  1. if($wartosc >= 0) {
  2. if( $wartosc > 3999 ) {
  3. if( $wartosc > 7999 ) {
  4. if( $wartosc > 7999 ) {
  5. if( $wartosc > 11999 ) {
  6. $ranga = 'Weteran';
  7. } else {
  8. $ranga = 'Doświadczony';
  9. }
  10. } else {
  11. $ranga = 'Doświadczony';
  12. }
  13. } else {
  14. $ranga = 'Młodzian';
  15. }
  16. } else {
  17. $ranga = 'Początkujący';
  18. }
  19. } else {
  20. $ranga = 'Cheater'; //jeśli wrzucasz kogoś na minus to na bank coś przeskrobał :)
  21. }
Tu masz wersję zagnieżdżona dla rang. Nie jest ładna, ale zadziała jak trzeba. Jeśli chcesz, by funkcja była dynamicznie modyfikowalna (co jakiś czas zmieniasz nazwy rang lub wartości) to stwórz funkcję, gdzie jako parametr przekazujesz tablicę z zakresami dolnymi jako klucze (IMG:style_emoticons/default/smile.gif) Przykład masz tutaj mniej więcej...
  1. <?php
  2. $tabela_zakresow = array(
  3. 0 => 'Początkujący',
  4. 12000 => 'Weteran',
  5. 4000 => 'Doświadczony',
  6. 8000 => 'Młodzian'
  7. );
  8. //ważne są klucze i nazwy. Nie muszą być po kolei.
  9.  
  10. function ranga( $staty, $rangi ) {
  11. //sprawdzam czy mi podano tablicę rang. Jeśli nie - rzucam false, ale można też tutaj sypnąć wyjątkiem, jak kto woli.
  12. if( !is_array( $rangi ) ) {
  13. return false;
  14. }
  15. //tu sprawdzam czy mi podano liczbę postów/artykułów/czegoś usera, tu też może być wyjątek.
  16. if( !is_numeric( $staty ) ) {
  17. return false;
  18. }
  19. //sortowanie kluczy! dzięki temu nie muszę ich podawać w tablicy po kolei :) Te sortowanie załatwia mi ów problem
  20. ksort( $rangi, SORT_NUMERIC );
  21. end($rangi);
  22. while ( !is_null( $key = key($rangi) ) ) {
  23. if( $key > $staty ) {
  24. prev($rangi);
  25. } else {
  26. return current($rangi);
  27. }
  28. }
  29. return 'Cheater!';// To jeśli w tablicy brak rangi, a więc poniżej progu najniższego
  30. }
  31.  
  32. echo ranga( 'test', $tabela_zakresow ).'<br />';//powinno zwrócić pustkę lub false jeśli zrobisz var_dump( ranga( 'test', $tabela_zakresow ) ) :)
  33. echo ranga( -666, $tabela_zakresow ).'<br />';
  34. echo ranga( 10000, $tabela_zakresow ).'<br />';
  35. echo ranga( 4000, $tabela_zakresow ).'<br />';
  36. echo ranga( 20000, $tabela_zakresow ).'<br />';
  37. echo ranga( 500, $tabela_zakresow ).'<br />';
  38. ?>
Oczywiście "magia" to żart. Posortowaną tablicę przeszukuję od końca tak długo, aż nie dojdę do początku. Gdy jestem w pętli to porównuję wartość liczbową podaną w funkcji do aktualnego progu i jeśli klucz jest większy to lecę do elementu wcześniej w tablicy. Jeśli nie jest to prawda, to znaczy, że wpadłem we właściwy zakres i zwracam wartość dla tego klucza. Jeśli dojdę do końca i nie znajdę pasującego to wywalam rangę domyślną dla oszusta (IMG:style_emoticons/default/smile.gif)

Zwracaj uwagę na to co zwraca funkcja ranga. jeśli dała w wyniku false to sygnalizuj błąd. Uważaj na 0... Jeśli zrobisz głupie
  1. if( ranga(0, $tabela) ) {
  2. } else {
  3. else 'error';
  4. }

to wywali Ci error jeśli będziesz zwracał jako nazwę 0, '0' lub cokolwiek innego dające się do false przekonwertować w locie. Powinno być:
  1. if( ranga(0, $tabela) !== false ) {
  2. } else {
  3. else 'error';
  4. }

Do latania po pętli mogłem też użyć foreach, co jest wygodne przy małych petlach. Ale tutaj dla celów edukacyjnych użyłem while, byś wiedział, że tak też można, a dodatkowo przy ogromnych pętlach while jest wydajniejsze. Tutaj to tylko sztuka dla sztuki i ukazanie że można. Równie dobrze możesz to foreach zastąpić, bo wątpliwe byś miał kiedykolwiek więcej niż kilka tysięcy rang (IMG:style_emoticons/default/winksmiley.jpg) Dodatkowo jeśli masz pewność, że klucze są już podane w odpowiedniej kolejności od najmniejszej do największej to możesz usunąć z wnętrza ksort, który spowalnia całość.
Powód edycji: [thek]: [thek]: Poprawiłem literówki małe i dodałem komentarze :)
Go to the top of the page
+Quote Post

Posty w temacie


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: 17.09.2025 - 11:44