Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Jak wyświetlić odpowiednie sformuowanie
Forum PHP.pl > Forum > Przedszkole
Szunaj85
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!!!
barthpl
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.
nexis
  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. ?>
Szunaj85
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". 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 biggrin.gif
barthpl
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...
Szunaj85
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. 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
barthpl
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.
Szunaj85
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?
barthpl
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 winksmiley.jpg
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.