Array cu valori la singular/plural in functie de caz

Ai o întrebare legată de PHP? Incercăm să îi găsim soluţie. Sau poate doar vrei să publici un cod interesant.

Moderatori: Zamolxe, Moderatori

Laur
New Member
Mesaje: 2
Membru din: Mar Oct 19, 2004 7:23 pm
Localitate: Bucuresti
Contact:

Array cu valori la singular/plural in functie de caz

Mesajde Laur » Mar Sep 17, 2013 10:24 pm

Salutare! Am si eu o problema, poate ma puteti ajuta. Am urmatoarea functie care imi afiseaza perioada "in urma cu "

Cod: Selectaţi tot

function time_elapsed_string($datetime) {
    $now = new DateTime;
    $ago = new DateTime($datetime);
    $diff = $now->diff($ago);

    $string = array(
        'y' => 'an',
        'm' => 'luna',
        'd' => 'zi',
        'h' => 'ora',
        'i' => 'minut',
        's' => 'secunda',
    );
    foreach ($string as $k => $v) {
        if ($diff->$k) {
            return $diff->$k . ' ' . $v . ($diff->$k > 1 ? ' s' : '');
        }
    }
    return 'cateva secunde';
}


Functia este ok pentru varianta in engleza pentru ca la plural adaugi un "s", cum as putea sa o adaptez pentru Romania astfel incat sa afiseze "ani, luni, zile, ore, minute, secunde"?

Multumesc de pe acum celor care isi pot rupe din timpul lor sa ma ajute.



Avatar utilizator
Birkoff
Senior Member
Mesaje: 6380
Membru din: Joi Mar 18, 2004 2:34 pm
Localitate: Bucuresti
Contact:

Re: Array cu valori la singular/plural in functie de caz

Mesajde Birkoff » Mar Sep 17, 2013 10:41 pm

pentru asta exista sprintf

faci un array cu textele ce ar putea aparea de exemplu

1 => "Sunt %s secunde"
2 => "%s ora"
3 => "%s ore"
4 => "%s minut"
5 => "%s minute"

Si afisezi de forma
sprintf("Sunt %s minute si %s secunde", $min, $sec);

eventual faci verificari daca == 1 pui minut daca e diferit de 1 pui minute la fel si la celelalte
1) CMS, ERP, CRM, etc... (doar pentru clienti))
2) Portofoliu, servicii, contact, blog
3) Folositi aceasta clasa sql in proiectele voastre (open source)
4) Vrei un magazin virtual la cheie, usor de folosit, cu api-uri incluse pentru maximizarea vanzarilor si multe alte facilitati? Da un semn si discutam.

LXS
Senior Member
Mesaje: 375
Membru din: Dum Oct 05, 2008 8:34 pm
Localitate: Timisoara
Contact:

Re: Array cu valori la singular/plural in functie de caz

Mesajde LXS » Mie Sep 18, 2013 4:47 pm

Gramatica limbii romane este total diferita de gramatica limbii engleze, cuvintele nu o sa le poti sufixa in mare parte doar cu o singura litera pentru a afla pluralul acestora dupa cum ti-ai dat seama.
Pentru fiecare $v din matricea $string va trebui sa faci pluralul fiecarui cuvant in parte altfel nu ai cum, ori conditionezi de 6 ori faci cu un switch.

Functia time_elapsed_string

Cod: Selectaţi tot

function time_elapsed_string($datetime) {
    $now = new DateTime;
    $ago = new DateTime($datetime);
    $diff = $now->diff($ago);

    $out = '';

    $string = array(
        'y' => 'an',
        'm' => 'lun',
        'd' => 'zi',
        'h' => 'or',
        'i' => 'minut',
        's' => 'secund',
    );

    foreach ($string as $k => $v) {
        if ($diff->$k) {
            switch($k)
            {
                case 'y':
                    $out+= $diff->$k . ' ' . $v . ($diff->$k > 1 ? ' i' : '') . ' ';
                break;
                case 'm':
                    $out+= $diff->$k . ' ' . $v . ($diff->$k > 1 ? ' i' : 'a'). ' ';
                break;
                case 'd':
                    $out+= $diff->$k . ' ' . $v . ($diff->$k > 1 ? ' le' : ''). ' ';                 
                break;
                case 'h':
                    $out+= $diff->$k . ' ' . $v . ($diff->$k > 1 ? ' e' : 'a'). ' ';
                break;
                case 'i':
                    $out+= $diff->$k . ' ' . $v . ($diff->$k > 1 ? ' e' : ''). ' ';
                break;
                case 's':
                    $out+= $diff->$k . ' ' . $v . ($diff->$k > 1 ? ' e' : 'a'). ' ';
                break;
            }
        }
    }
    return $out;
}

Laur
New Member
Mesaje: 2
Membru din: Mar Oct 19, 2004 7:23 pm
Localitate: Bucuresti
Contact:

Re: Array cu valori la singular/plural in functie de caz

Mesajde Laur » Mie Sep 18, 2013 10:21 pm

Va multumesc pentru sugestii, am ajuns la urmatoarea varianta functionala:

Cod: Selectaţi tot

function time_elapsed_string($time)
{
$periods = array("secunde", "minute", "ore", "zile", "saptamani", "luni", "ani", "decade");
$lengths = array("60","60","24","7","4.35","12","10");
 
$now = time();
 
$difference = $now - $time;
$tense = "ago";
 
for($j = 0; $difference >= $lengths[$j] && $j < count($lengths)-1; $j++) {
$difference /= $lengths[$j];
}
 
$difference = round($difference);
 
$t = "$difference $periods[$j]";
 
if($t == "1 secunde") {
$t = "o secunda";
}
if($t == "1 minute") {
$t = "un minut";
}
if($t == "1 ore") {
$t = "o ora";
}
 
if($t == "1 zile") {
$t = "o zi";
}
if($t == "1 saptamani") {
$t = "o saptamana";
}
if($t == "1 luni") {
$t = "o luna";
}
// editeaza restu de aici
 
return $t;
}


Înapoi la “Cod PHP”

Cine este conectat

Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 18 vizitatori