Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [class] Ile komentarzy?
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
michalkjp
Często spotykamy (głównie na blogach i w serwisach newsowych) linki prowadzące do komentarzy w stylu:

2 komentarzy

22 komentarzy

etc.




Poniższy prosty skrypcik powinien zadbać o prawidłową odmianę.



  1. <?php
  2.    class ile_komentarzy
  3.    {
  4.        function ile($num)
  5.        {
  6.            if(!is_int($num)) {
  7.                $str = "Podana wartość musi być typu unsigned int";
  8.                return $str;
  9.            }
  10.  
  11.            if ($num == 0) {
  12.                $str = "Brak komentarzy";
  13.            } elseif ($num == 1) {
  14.                $str = "Jeden komentarz";
  15.            } else {
  16.                $num_tab = str_split($num);
  17.                $num_l = end($num_tab);
  18.                $num_p = prev($num_tab);
  19.  
  20.                if (($num_p == 1) or ($num_l == 0) or ($num_l == 1) or (($num_l >= 5) and ($num_l <= 9))) {
  21.                    $str = $num." komentarzy";
  22.                } elseif (($num_l > 1) and ($num_l < 5)) {
  23.                    $str = $num." komentarze";
  24.                }
  25.            }
  26.  
  27.            return $str;
  28.        }
  29.    }
  30. ?>

Test:




  1. <?php
  2.    ini_set('error_reporting', E_ALL);
  3.    ini_set('display_errors', 1);
  4.    include_once('ile_komentarzy.php');
  5.  
  6.    $l = new ile_komentarzy();
  7.    for ($i = 0; $i <= 30; $i++) {
  8.        $ret = $l->ile($i);
  9.        print("$ret<br />");
  10.    }
  11. ?>




Wynik:

Brak komentarzy
Jeden komentarz
2 komentarze
3 komentarze
4 komentarze
5 komentarzy
6 komentarzy
7 komentarzy
8 komentarzy
9 komentarzy
10 komentarzy
11 komentarzy
12 komentarzy
13 komentarzy
14 komentarzy
15 komentarzy
16 komentarzy
17 komentarzy
18 komentarzy
19 komentarzy
20 komentarzy
21 komentarzy
22 komentarze
23 komentarze
24 komentarze
25 komentarzy
26 komentarzy
27 komentarzy
28 komentarzy
29 komentarzy
30 komentarzy





P.S. Jestem tu nowy (PHP też się zajmuje od niedawna), więc jeśli zrobiłem jakąś dużą wpadkę w tym skrypcie, to nie obśmiewajcie mnie, tylko wytłumaczcie w miarę prostych słowach o co chodzi – szybko się uczę winksmiley.jpg
Moli
Cytat
jakąś dużą wpadkę w tym skrypcie

Zrobiłes smile.gif Po co klasa do jednej funkcji ? smile.gif

Ogólnie spoko, ale mógł byś to zautomatyzować, żeby użytkownik wybierał do czego ma liczyć (np. pliki w galerii itp.). Ale to malutka taka uwaga smile.gif
michalkjp
Cytat(Moli @ 20.09.2008, 20:04:03 ) *
Zrobiłes smile.gif Po co klasa do jednej funkcji ? smile.gif


(Kiedyś nie lubiłem programowania obiektowego, później je polubiłem i zacząłem stosować wszędzie tam, gdzie jest przydatne, teraz chyba zacząłem z nim przesadzać smile.gif)

Cytat(Moli @ 20.09.2008, 20:04:03 ) *
Ogólnie spoko, ale mógł byś to zautomatyzować, żeby użytkownik wybierał do czego ma liczyć (np. pliki w galerii itp.).


Mógłbym, tylko to trzeba dostosować do konkretnego przypadku (inaczej wchodzimy na teren trudnej odmiany). Chcielibyśmy np. liczyć marynarzy - wystarczy dodać parametr w którym podajemy rzeczownik w mianowniku lp. "marynarz" - końcówki powinny być ok. Jednak jak zmienimy rzeczownik na inny np. "ramka", to końcówki się pozmieniają.

Tak klasa to tylko przykład jak w łatwy sposób poradzić sobie z końcówkami, żeby się dało dostosować do konkretnego przypadku.
Moli
Cytat
wszędzie tam, gdzie jest przydatne

Ale tutaj nie jest smile.gif
Speedy
Fajny pomysł smile.gif. Ja również nie przepadam za nieprawidłową odmianą, ale zawsze szedłem na łatwiznę stosując konstrukcję uniwersalną typu: "Liczba komentarzy: 2" biggrin.gif.
Łukasz O.
Kod
/**
* odmiana rzeczownika przez przypadki
*
* przykład: $this->deklinacja(5,'piwo','piwa','piw');
*
* podpowiedź: formy rzeczownika najlepiej podawać dla liczb: 1,2,6 czyli np.
*     1 moneta, 2 monety, 6 monet
*     1 pies,   2 psy,    6 psów
*
* @param int    $ilosc      - liczba elementów
* @param string $mp         - forma mianownika liczby pojedyńczej
* @param string $mm         - forma mianownika liczby mnogiej
* @param string $dm         - forma dopełniacza liczby mnogiej
*
* @return string
*/

class Zend_View_Helper_Deklinacja
{
    function Deklinacja($ilosc,$mp,$mm,$dm) {
        // jeśli mamy tylko jeden przedmiot zwracamy mianownik pojedyńczej
        if ($ilosc==1) return $mp;

        // dla jedności xxxx(2|3|4|5) oraz przedziału 10-21 (wyjątek!) mianownik mnogiej
        if ( ($ilosc%10 > 1) &&
             ($ilosc%10 < 5) &&
            !(($ilosc%100 >= 10) && ($ilosc%100 <= 21))
            ){
                return $ilosc." ".$mm;
        }

        // pozostałe to już dopełniacz mnogiej
        return $ilosc." ".$dm;
    }
}


konstrukcja "Liczba komentarzy: 2" to coś, za co powinni na długo na wolnym ogniu opiekać - świadczy tylko o tym, że programista idzie na łatwiznę
Speedy
Cytat(Łukasz O. @ 22.09.2008, 20:37:01 ) *
konstrukcja "Liczba komentarzy: 2" to coś, za co powinni na długo na wolnym ogniu opiekać - świadczy tylko o tym, że programista idzie na łatwiznę


Dlaczego? Przecież w programowaniu chodzi o to, żeby osiągnąć efekt jak najszybciej i jak najprościej. Krótko mówiąc: proces programowania jest chodzeniem na łatwiznę, bo zmuszasz komputer, żeby zrobił coś za Ciebie. Co jest niepoprawnego (pod względem stylistycznym, językowym tudzież technicznym) w konstrukcji: "Liczba komentarzy: 2"? Jedynym argumentem przeciw takiemu rozwiązaniu jest fakt, że tekst: "2 komentarze" wygląda lepiej, a Ty skwitowałeś inną konstrukcję tak, jakby była ona jakimś marginalnym błędem.
prz3kus
łopotologicznie, po staremu tongue.gif

  1. <?php
  2. function komentarze_liczbowe($zmienna){
  3. if($zmienna == 0)
  4. $zmienna = "Brak komentarzy";
  5. if($zmienna == 1)
  6. $zmienna = $zmienna.' komentarz';
  7. if(($zmienna > 1)&&($zmienna < 5))
  8. $zmienna = $zmienna.' komentarze';
  9. if($zmienna > 4)
  10. $zmienna = $zmienna. ' komentarzy';
  11. return $zmienna;
  12. }
  13. ?>
michalkjp
Cytat(prz3kus @ 27.09.2008, 00:58:01 ) *
łopotologicznie, po staremu tongue.gif


Funkcję zamieściłem po to, żebyś nie musiał robić łopatologicznie. Twój sposób jest świetny jeśli chcesz mieć "22 komentarzy" smile.gif.
mecenas
fajnie, kiedy programiści nie zapominają, że jednak najczęściej komunikują się (zazwyczaj smile.gif ) w języku polskim. Niestety, korzystając z różnej maści softu można odnieść zupełnie inne wrażenie... Dlatego ja sam staram się przestrzegać poprawności językowej, niemniej czepianie się: "Liczba komentarzy: #" jest już zwykłą nadgorliwością. Świetnie, jeśli ktoś się postara i zadba o odmianę, ale w tym przypadku nie byłbym aż tak surowy.
LBO
Funkcja o tak wąskim zasięgu generalnie mija się z celem.

Dlatego korzysta się z i18n i l10n i gotowych narzędzi z nimi związanych.
Crozin
w przypadku wystąpienia błędu użyj wyjatków (Exception" title="Zobacz w manualu PHP" target="_manual) albo chociaż trigger_error" title="Zobacz w manualu PHP" target="_manual.
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.