Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [class] Ile komentarzy?
michalkjp
post 20.09.2008, 18:52:20
Post #1





Grupa: Zarejestrowani
Postów: 182
Pomógł: 14
Dołączył: 20.09.2008

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


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
Moli
post 20.09.2008, 19:04:03
Post #2





Grupa: Zarejestrowani
Postów: 662
Pomógł: 45
Dołączył: 26.03.2007
Skąd: Warszawa

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


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
Go to the top of the page
+Quote Post
michalkjp
post 20.09.2008, 19:29:42
Post #3





Grupa: Zarejestrowani
Postów: 182
Pomógł: 14
Dołączył: 20.09.2008

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


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.
Go to the top of the page
+Quote Post
Moli
post 20.09.2008, 20:16:55
Post #4





Grupa: Zarejestrowani
Postów: 662
Pomógł: 45
Dołączył: 26.03.2007
Skąd: Warszawa

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


Cytat
wszędzie tam, gdzie jest przydatne

Ale tutaj nie jest smile.gif
Go to the top of the page
+Quote Post
Speedy
post 22.09.2008, 01:59:49
Post #5





Grupa: Zarejestrowani
Postów: 651
Pomógł: 28
Dołączył: 4.12.2004

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


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.


--------------------
Sygnatura niezgodna z regulaminem.
Go to the top of the page
+Quote Post
Łukasz O.
post 22.09.2008, 19:37:01
Post #6





Grupa: Zarejestrowani
Postów: 191
Pomógł: 5
Dołączył: 13.01.2007

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


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ę


--------------------
"Don't tell me you want a bridge - show me the canyon you want to cross" Giuseppe Delena
Go to the top of the page
+Quote Post
Speedy
post 24.09.2008, 15:40:16
Post #7





Grupa: Zarejestrowani
Postów: 651
Pomógł: 28
Dołączył: 4.12.2004

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


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.

Ten post edytował Speedy 24.09.2008, 15:40:32


--------------------
Sygnatura niezgodna z regulaminem.
Go to the top of the page
+Quote Post
prz3kus
post 26.09.2008, 23:58:01
Post #8





Grupa: Zarejestrowani
Postów: 260
Pomógł: 30
Dołączył: 22.01.2007

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


ł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. ?>
Go to the top of the page
+Quote Post
michalkjp
post 27.09.2008, 00:32:02
Post #9





Grupa: Zarejestrowani
Postów: 182
Pomógł: 14
Dołączył: 20.09.2008

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


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.
Go to the top of the page
+Quote Post
mecenas
post 27.09.2008, 12:20:36
Post #10





Grupa: Zarejestrowani
Postów: 80
Pomógł: 5
Dołączył: 23.09.2008
Skąd: Chełmno/Toruń

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


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.


--------------------
-- http://rafaljakubowski.net76.net --
google's my life ;)
Go to the top of the page
+Quote Post
LBO
post 27.09.2008, 12:53:43
Post #11





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


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.
Go to the top of the page
+Quote Post
Crozin
post 27.09.2008, 13:19:07
Post #12





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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.

Ten post edytował Crozin 27.09.2008, 13:19:59
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 02:19