Treci la conținutul principal

Gruparea unei colecții

Gruparea înseamnă repartizarea elementelor în coșuri. Alegi o cheie pentru fiecare element, iar toate elementele cu aceeași cheie ajung în același coș.

Cheia este calculată din elementul însuși. De exemplu, prima literă a unui cuvânt.

PHP nu are o funcție groupBy încorporată. Modul firesc de a grupa este un tablou asociativ în care cheile sunt cheile de grup, iar valorile sunt tablouri de elemente. O singură buclă foreach îl umple cu $groups[$key][] = $element. Adăugarea la o cheie care nu există încă pornește pur și simplu un grup nou — nu este nevoie de niciun caz special.

Un tablou asociativ PHP își păstrează ordinea de inserare: grupurile apar în ordinea în care a sosit primul lor element, iar rezultatul afișat arată la fel la fiecare rulare.


Grupare după cheie

Cea mai simplă grupare păstrează elementele așa cum sunt și doar decide în care coș ajunge fiecare.

Calculează cheia în interiorul buclei și adaugă elementul la $groups[$key]. Rezultatul asociază fiecărei chei tabloul de elemente cu acea cheie. Elementele din interiorul unui grup păstrează ordinea pe care o aveau la intrare.

Uneori vrei să modifici elementele în timpul grupării, de exemplu să le stochezi cu majuscule. Calculează cheia și valoarea nouă, apoi adaugă valoarea nouă la grup.

Grupează cuvintele după prima literă

$w[0] ia prima literă a cuvântului, iar strtoupper() o transformă în majusculă. Cuvintele care încep cu aceeași literă ajung în același tablou. Grupurile apar în ordinea inserării: O, apoi T, apoi F.

Prompt
Grupează cuvintele one, two, three, four, five după prima lor literă scrisă cu majusculă. Construiește un tablou asociativ într-o buclă foreach cu $byFirstLetter[$key][] = $w și afișează-l cu json_encode.
Ieșire: script PHP
Group words by first letter

Grupează și modifică valorile

Cheia este prima literă scrisă cu minusculă. Valoarea stocată este cuvântul întreg cu majuscule. Bucla le calculează pe amândouă și adaugă valoarea la $groups[$key].

Prompt
Grupează cuvintele one, two, three, four, five după prima lor literă scrisă cu minusculă. Stochează fiecare cuvânt în grupul său cu majuscule, nu așa cum era. Calculează cheia și valoarea nouă într-o buclă foreach, adaugă cu $groups[$key][] = $value și afișează tabloul cu json_encode.
Ieșire: script PHP
Group and change the values

Numărarea fiecărui grup

Adesea nu ai nevoie de elementele fiecărui grup, ci doar de câte sunt.

PHP are un numărător încorporat: array_count_values(). Acesta numără cât de des apare fiecare valoare într-un tablou. Pentru a număra cuvintele după prima literă, transformă mai întâi fiecare cuvânt în prima sa literă cu array_map(), apoi lasă array_count_values() să numere literele.

Numără cuvintele după prima literă

array_map() transformă cuvintele în literele o, t, t, f, f. array_count_values() numără apoi fiecare literă: un o, doi t, doi f.

Prompt
Numără câte dintre cuvintele one, two, three, four, five încep cu fiecare literă. Transformă cuvintele în primele lor litere cu array_map, numără literele cu array_count_values și afișează rezultatul cu json_encode.
Ieșire: script PHP
Count words per first letter

Pliere și reducere pe fiecare grup

Plierea unui grup înseamnă combinarea elementelor sale într-o singură valoare, pas cu pas. Un total curent este exemplul clasic: pornești de la 0 și adaugi fiecare element.

Modul PHP este un tablou asociativ care ține valoarea curentă a fiecărui grup. Pentru fiecare element, calculează cheia sa și actualizează valoarea stocată sub acea cheie.

Citirea unei chei care nu este încă în tablou ar produce un avertisment, așa că folosește operatorul ??: $sums[$key] ?? 0 dă discret 0 când cheia lipsește. Când primul element trebuie să inițializeze el însuși valoarea, verifică cu isset() dacă cheia există deja.

Suma fiecărui grup

Fiecare număr este pus în grupul "even" sau "odd" și adăugat la suma acelui grup. ($sums[$key] ?? 0) + $n pornește un grup nou de la 0, așa că nu este nevoie de niciun caz special.

Prompt
Ia numerele 3, 4, 5, 6, 7, 8 și pune fiecare în grupul "even" sau "odd". Adună fiecare număr la suma curentă a grupului său cu $sums[$key] = ($sums[$key] ?? 0) + $n, astfel încât o cheie lipsă să pornească de la 0. Afișează tabloul cu json_encode.
Ieșire: script PHP
Sum each group

Construiește un șir de caractere pentru fiecare grup

Primul număr al unui grup începe șirul de caractere. Fiecare număr următor este unit cu "+". isset($chains[$key]) distinge cele două cazuri, iar (string)$n transformă primul număr în text.

Prompt
Ia numerele 3, 4, 5, 6, 7, 8 și pune fiecare în grupul "even" sau "odd". Pentru fiecare grup construiește pas cu pas un șir de caractere: primul număr începe șirul, iar fiecare număr următor este adăugat cu "+" înainte, dând un text precum 3+5+7. Folosește isset pentru a distinge cele două cazuri și afișează tabloul cu json_encode.
Ieșire: script PHP
Build a string per group