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.
Ieșire: script PHP
<?php
$words = ["one", "two", "three", "four", "five"];
// Adăugarea la o cheie care nu există încă începe un grup nou.
$byFirstLetter = [];
foreach ($words as $w) {
$key = strtoupper($w[0]);
$byFirstLetter[$key][] = $w;
}
echo json_encode($byFirstLetter), "\n";
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].
Ieșire: script PHP
<?php
$words = ["one", "two", "three", "four", "five"];
$groups = [];
foreach ($words as $w) {
$key = $w[0]; // prima literă, cu minusculă
$value = strtoupper($w); // valoarea stocată în grup
$groups[$key][] = $value;
}
echo json_encode($groups), "\n";
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.
Ieșire: script PHP
<?php
$words = ["one", "two", "three", "four", "five"];
// array_count_values() numără de câte ori apare fiecare valoare.
$letters = array_map(fn($w) => $w[0], $words);
$counts = array_count_values($letters);
echo json_encode($counts), "\n";
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.
Ieșire: script PHP
<?php
$numbers = [3, 4, 5, 6, 7, 8];
// O cheie lipsă devine 0 cu ??, așa că adunarea nu are nevoie de un caz special.
$sums = [];
foreach ($numbers as $n) {
$key = $n % 2 === 0 ? "even" : "odd";
$sums[$key] = ($sums[$key] ?? 0) + $n;
}
echo json_encode($sums), "\n";
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.
Ieșire: script PHP
<?php
$numbers = [3, 4, 5, 6, 7, 8];
$chains = [];
foreach ($numbers as $n) {
$key = $n % 2 === 0 ? "even" : "odd";
// Primul număr al unui grup începe șirul de caractere; următoarele se unesc cu "+".
if (!isset($chains[$key])) {
$chains[$key] = (string)$n;
} else {
$chains[$key] .= "+" . $n;
}
}
echo json_encode($chains), "\n";