Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Jak wyświetlić odpowiednie sformuowanie
Szunaj85
post
Post #1





Grupa: Zarejestrowani
Postów: 392
Pomógł: 7
Dołączył: 11.05.2008

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


Na wielu stronach www można znaleźć liczniki osób. Jednak z reguły treść jest taka: "licznik osób" lub odwiedziło nas osób:"
Ja natomiast chciałbym stworzyć licznik bardziej inteligentniejszym i w zależności od tego jaka ilość osób będzie w zmiennej dopasuje on odpowiednie sformuowanie i wyświetli je.
Problemu by nie było gdybym wiedział jak to ukrócić. Przecież nie mogę pisać warunku dla każdej liczby.
Chodzi o to żeby skrypt brał pod uwagę dwie ostatnie cyfry z całego ciągu znaków. Np.: Jak mam 113863 osoby (to tylko 63). Oczywiście jeśli ciąg jest większy od dwucyfrowej liczby.
No i jeszcze jakiś wyjątek dla liczby 1, ponieważ nie może być 1 osób tylko 1 osoba, ale już 11 osób, ...,111 osób, itd.
Podobnie dla 2 będzie osoby, dla 12 osób, dla 22 osoby, 32 osoby, ..., 102 osoby, itd
Dla pozostałych cyfr według powyższych reguł. To trzeba wziąć pod uwagę!
Oczywiście takie rozwiązanie można by zastosować nie tylko w licznikach.
Na razie kod wygląda tak:

  1. <?php
  2. if ($liczba==1) { echo 'osoba'; }
  3. elseif ($liczba==2) { echo 'osoby'; }
  4. elseif ($liczba==3) { echo 'osoby'; }
  5. elseif ($liczba==4) { echo 'osoby'; }
  6. elseif ($liczba==5) { echo 'osób'; }
  7. elseif ($liczba==6) { echo 'osób'; }
  8. elseif ($liczba==7) { echo 'osób'; }
  9. elseif ($liczba==8) { echo 'osób'; }
  10. elseif ($liczba==9) { echo 'osób'; }
  11. //Tutaj oczywiście zostaną dopisane pozostałe liczby
  12. else { echo 'osób'; }
  13. ?>

Mam nadzieję, że to dobra pętla do tego zadania. Może da się to jakoś uprościć żeby nie wpisywać tylu warunków.
Jestem też otwarty na inne rozwiązania jeżeli moje okaże się błędne!!!

Ten post edytował Szunaj85 9.09.2008, 21:23:04
Go to the top of the page
+Quote Post
barthpl
post
Post #2





Grupa: Zarejestrowani
Postów: 142
Pomógł: 35
Dołączył: 5.12.2006
Skąd: Wrocław

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


Cytat(Szunaj85 @ 9.09.2008, 21:20:28 ) *
Problemu by nie było gdybym wiedział jak to ukrócić. Przecież nie mogę pisać warunku dla każdej liczby.
Chodzi o to żeby skrypt brał pod uwagę dwie ostatnie cyfry z całego ciągu znaków. Np.: Jak mam 113863 osoby (to tylko 63). Oczywiście jeśli ciąg jest większy od dwucyfrowej liczby.
Ogólnie do programowania przydaje się czasami znajomość matematyki a przynajmniej jej bazowych operacji takich jak: dodawani, odejmowanie, mnożenie, dzielenie no i modulo (reszta z dzielenia). Ta ostatnia znakomicie się przydaje jeżeli chcesz wiedzieć dwie ostatnie cyfry z liczby.
  1. <?php
  2. $counter = 113863;
  3. $sufix = $counter % 100 // reszta z dzielenia przez sto;
  4. echo $sufix; // wynik to 63
  5. ?>

Ale zastanawiam się czy nie wystarczy ci znajomość ostatniej cyfry. Za wyjątkiem wspomnianej 12 to chyba nie wiele się różnią
Cytat(Szunaj85 @ 9.09.2008, 21:20:28 ) *
No i jeszcze jakiś wyjątek dla liczby 1, ponieważ nie może być 1 osób tylko 1 osoba, ale już 11 osób, ...,111 osób, itd.
Podobnie dla 2 będzie osoby, dla 12 osób, dla 22 osoby, 32 osoby, ..., 102 osoby, itd
Jeżeli chodzi o dwunastkę to faktycznie sprawdzasz czy odcięte dwie cyfry stanowią dwunastkę. Natomiast co do dwójki to ponownie operacja modulo i warunek
  1. <?php
  2. if( $counter % 2 == 0 ) {} // lub sprawdzenie $sufix, bo da taki sam rezultat;
  3. ?>


Czyli ja bym zaproponował coś takiego:
  1. <?php
  2. if( $counter == 1 ) echo 'osoba';
  3. else {
  4.    $sufix = $counter % 100;
  5.    if( $sufix > 12 && $sufix < 15  ) echo 'osób';
  6.    else {
  7.        $liczba = $sufix % 10;
  8.        switch( $liczba ) {
  9.            case 0<span style="color: #007700":
  10.            case 1<span style="color: #007700":
  11.            case 5<span style="color: #007700":
  12.            case 6<span style="color: #007700":
  13.            case 7<span style="color: #007700":
  14.            case 8<span style="color: #007700":
  15.            case 9'osób'; break
  16.            case 2<span style="color: #007700":
  17.            case 3<span style="color: #007700":
  18.            case 4'osoby';
  19.        }    
  20.    }
  21. }
  22. ?>

ale nie testowałem więc nie wiem czy to jest poprawne.
Go to the top of the page
+Quote Post
nexis
post
Post #3





Grupa: Zarejestrowani
Postów: 1 012
Pomógł: 109
Dołączył: 26.09.2003
Skąd: nexis.pl

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


  1. <?php
  2. // Funkcja
  3. function odmiana($odmiany, $int) {
  4.   $txt = $odmiany[2];
  5.   if ($int == 1) $txt = $odmiany[0];
  6.   $jednosci = (int) substr($int,-1);
  7.   $reszta = $int % 100;
  8.   if (($jednosci > 1 && $jednosci < 5) &! ($reszta > 10 && $reszta < 20))
  9.      $txt = $odmiany[1];
  10.   return $txt;
  11. }
  12.  
  13. // Przykład użycia
  14. echo $ile . odmiana(array('osoba', 'osoby', 'osób'), $ile);
  15.  
  16. ?>


Ten post edytował nexis 9.09.2008, 22:00:19
Go to the top of the page
+Quote Post
Szunaj85
post
Post #4





Grupa: Zarejestrowani
Postów: 392
Pomógł: 7
Dołączył: 11.05.2008

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


Barthpl - rozumiem, że w twoim kodzie zmienną określającą liczbę osób jest $liczba, ale ten kod coś nie działa.
Nexis - rozumiem, że w twoim kodzie zmienną określającą liczbę osób jest $ile, ale za każdym razem czy 1 czy 20 wyświetla słowo "osób". (IMG:http://forum.php.pl/style_emoticons/default/dry.gif)
Ja mam coś takiego:
  1. <?php echo($suma); ?>

Więc daje porównanie np.:
  1. <?php echo($suma);
  2. $suma = $ile;
  3. //Reszta kodu
  4. ?>

Na razie bardziej mi się podoba kod Nexis ponieważ jakoś działa, tylko można powiedzieć, że jest praktycznie bezużyteczny skoro chyba zawsze wyświetla słowo osób. Ten sam efekt mogę przecież uzyskać poprzez np. echo (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
barthpl
post
Post #5





Grupa: Zarejestrowani
Postów: 142
Pomógł: 35
Dołączył: 5.12.2006
Skąd: Wrocław

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


funkcja zdefiniowana jest tak (prawiłem ją nieco):
Kod
function odmiana( $counter ) {
    if( $counter == 1 ) return 'osoba';
    else {
       $sufix = $counter % 100;
       if( $sufix > 11 && $sufix < 15  ) return 'osób';
       else {
           $liczba = $sufix % 10;
           switch( $liczba ) {
               case 0:
               case 1:
               case 5:
               case 6:
               case 7:
               case 8:
               case 9: return 'osób';
               case 2:
               case 3:
               case 4:
               default:
                       return 'osoby';
           }    
       }
    }
}

i przykład użycia (co by nie było wątpliwości co i jak):
  1. <?php
  2. $liczba[] = 13;
  3. $liczba[] = 1;
  4. $liczba[] = 101;
  5. $liczba[] = 123;
  6. $liczba[] = 112;
  7. $liczba[] = 197;
  8.  
  9. foreach( $liczba as $i )
  10.    echo $i.' '.odmiana( $i ).'<br/>';
  11. ?>

co daję następujący wynik:
13 osób
1 osoba
101 osób
123 osoby
112 osób
197 osób

@moderatorzy: jak się wkleja kod switch'a w PHP to dziwnie ucina...
Go to the top of the page
+Quote Post
Szunaj85
post
Post #6





Grupa: Zarejestrowani
Postów: 392
Pomógł: 7
Dołączył: 11.05.2008

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


Jednak wątpliwości są. Zrobiłem tak:
  1. <?php
  2. //Powyżej znajduje się skrypt oraz kod HTML
  3. ?>
  4. <?php echo($suma);
  5. //Zmienna $suma to ilość osób, więc zrobiłem tak, $suma = $liczba;              
  6. $suma = $liczba;              
  7. function odmiana( $counter ) {
  8.    if( $counter == 1 ) return 'osoba';
  9.    else {
  10.       $sufix = $counter % 100;
  11.       if( $sufix > 11 && $sufix < 15  ) return 'osób';
  12.       else {
  13.           $liczba = $sufix % 10;
  14.           switch( $liczba ) {
  15.               case 0<span style="color: #007700":
  16.               case 1<span style="color: #007700":
  17.               case 5<span style="color: #007700":
  18.               case 6<span style="color: #007700":
  19.               case 7<span style="color: #007700":
  20.               case 8<span style="color: #007700":
  21.               case 9'osób';
  22.               case 2<span style="color: #007700":
  23.               case 3<span style="color: #007700":
  24.               case 4<span style="color: #007700":
  25.               defaul:
  26.                       return 'osoby';
  27.           }    
  28.       }
  29.    }
  30. }
  31. ?>

Tylko teraz nie wiem jak to prawidłowo wywołać, wyświetlić poprzez echo. (IMG:http://forum.php.pl/style_emoticons/default/sadsmiley02.gif)

moderatorzy też wczoraj miałem problem z wklejeniem pętli switch. Wszystkie echa mi zjadało. Ogólnie to cały kod świruje

Ten post edytował Szunaj85 10.09.2008, 18:48:17
Go to the top of the page
+Quote Post
barthpl
post
Post #7





Grupa: Zarejestrowani
Postów: 142
Pomógł: 35
Dołączył: 5.12.2006
Skąd: Wrocław

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


Jeżeli w zmiennej $suma masz zliczoną liczbę odwiedzin to zaproponowanej funkcji użyj tak:
  1. <?php
  2. echo $suma.' '.odmiana($suma);
  3. ?>
Oczywiście funkcja musi być gdzieś wcześniej zadeklarowana. Prościej się chyba tego nie da wytłumaczyć. Polecam raz jeszcze przejrzeć kurs dla początkujących, szczególnie część mówiącą w jaki sposób definiować funkcje.
Go to the top of the page
+Quote Post
Szunaj85
post
Post #8





Grupa: Zarejestrowani
Postów: 392
Pomógł: 7
Dołączył: 11.05.2008

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


Mam jeszcze takie pytanie. Skrypt Barthpl wyświetla (ilość osób) oraz (odpowiednią odmianę słowa osób).
1. Ja natomiast chciałbym wpisać do tego skryptu jeszcze tekst przed (ilość osób) oraz (odpowiednią odmianę słowa osób), który w zależności od ilości osób był by wyświetlany podobnie jak te odmiany osoba, osób, osoby.
Wiem jak odmieniać, ale nie wiem jak ten tekst wstawić w skrypt żeby wyszło np. Głosowało 5 osób, Głosowały 23 osoby, itp
2. Jak napisać regółę wiem, ale nie wiem co zrobić żeby w momencie kiedy nikt nie zagłosował nie wyświetlało się "0" tylko sam komunikat, np. Jeszcze nikt nie głosował.
  1. <?php
  2. function odmiana( $counter ) {
  3.    if( $counter == 1 ) return 'osoba';
  4.    else {
  5.       $sufix = $counter % 100;
  6.       if( $sufix > 11 && $sufix < 15  ) return 'osób';
  7.       else {
  8.           $liczba = $sufix % 10;
  9.           switch( $liczba ) {
  10.               case 0:
  11.               case 1:
  12.               case 5:
  13.               case 6:
  14.               case 7:
  15.               case 8:
  16.               case 9: return 'osób';
  17.               case 2:
  18.               case 3:
  19.               case 4:
  20.               default:
  21.                       return 'osoby';
  22.           }    
  23.       }
  24.    }
  25. }
  26. ?>

Mam pewien pomysł żeby przepisać kod jeszcze raz i wstawić tam inne sformuowania, ale czy nie da się krócej?

Ten post edytował Szunaj85 5.10.2008, 14:32:21
Go to the top of the page
+Quote Post
barthpl
post
Post #9





Grupa: Zarejestrowani
Postów: 142
Pomógł: 35
Dołączył: 5.12.2006
Skąd: Wrocław

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


może przerobić funkcję w bardo porosty sposób (wydaje mi się że słowa odmieniają się w taki sam sposób, ale nie jestem pewien)

  1. <?php
  2. function odmiana( $counter )
  3. {    
  4.    if( $counter == 0 ) return 'nikt jeszcze nie głosował';
  5.    else if( $counter == 1 ) return 'glosowała 1 osoba';
  6.    else {
  7.        $sufix = $counter % 100;
  8.        if( $sufix > 11 && $sufix < 15  ) return "głosowało $counter osób";
  9.        else {
  10.            $liczba = $sufix % 10;
  11.            switch( $liczba ) {
  12.                case 0:
  13.                case 1:
  14.                case 5:
  15.                case 6:
  16.                case 7:
  17.                case 8:
  18.                case 9: return "głosowało $counter osób";
  19.                case 2:
  20.                case 3:
  21.                case 4:
  22.                default:
  23.                    return "głosowały $counter osoby";
  24.            }
  25.        }
  26.    }
  27. }
  28. ?>
...wydaje się że jest poprawnie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
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: 19.09.2025 - 19:26