Treci la conținutul principal

Filtrarea unei colecții

Filtrarea înseamnă alegerea elementelor unei colecții care îndeplinesc o condiție.

Condiția se scrie ca o funcție care primește un element și returnează true (îl păstrăm) sau false (îl sărim). O astfel de funcție se numește predicat.

Filtrarea construiește un tablou nou. Tabloul original nu este modificat.

PHP are un filtru integrat: array_filter(). Primește un tablou și un predicat și returnează un tablou nou cu elementele pentru care predicatul spune da. Sintaxa scurtă a funcției-săgeată fn($w) => ... menține apelul compact.

Un lucru de ținut minte: array_filter() păstrează cheile originale. Când vrei o listă curată, numerotată din nou de la 0, învelește rezultatul în array_values().


Filtrarea după predicat

Cel mai simplu mod de a filtra este să transmiți tabloul și un predicat către array_filter(). În mod implicit, predicatul primește doar valoarea.

Cu indicatorul ARRAY_FILTER_USE_BOTH predicatul primește valoarea și cheia, astfel încât un tablou asociativ poate fi filtrat după ambele în același timp. Indicatorul ARRAY_FILTER_USE_KEY transmite doar cheia.

Într-o listă simplă cheile sunt pozițiile 0, 1, 2, …, deci ARRAY_FILTER_USE_BOTH permite și ca o condiție să folosească indicele elementului.

Pentru a păstra elementele care nu se potrivesc, pune ! în fața condiției. PHP nu are un filterNot separat.

Un tablou PHP poate conține valori de tipuri diferite. is_string() verifică dacă o valoare este un șir de caractere, iar $v !== null sare peste intrările care nu conțin nicio valoare.

Filtrarea unui tablou

Păstrăm doar cuvintele mai lungi de 3 litere. Condiția strlen($w) > 3 este transmisă lui array_filter() ca funcție-săgeată.

array_filter() păstrează cheile originale, așa că cuvintele păstrate se află în continuare la 2 și 3, iar json_encode() afișează {"2":"three","3":"four"}. După array_values() cheile încep din nou de la 0 și același apel afișează lista curată ["three","four"].

Prompt
Scrie un script PHP cu cuvintele one, two, three, four într-un tablou. Păstrează cuvintele mai lungi de 3 litere cu array_filter și o funcție-săgeată. Afișează tabloul filtrat cu json_encode pentru a arăta că cheile originale se păstrează, apoi afișează-l din nou după ce array_values a renumerotat cheile.
Ieșire: script PHP
Filter an array

Filtrarea unui tablou asociativ

Perechile a căror cheie se termină cu "1" și a căror valoare este mai mare decât 10 sunt păstrate. Indicatorul ARRAY_FILTER_USE_BOTH face ca array_filter() să transmită predicatului atât valoarea, cât și cheia, iar str_ends_with() verifică sfârșitul cheii.

Prompt
Creează un tablou asociativ de la cheile key1, key2, key3, key11 la valorile 1, 2, 3, 11. Folosește array_filter cu indicatorul ARRAY_FILTER_USE_BOTH pentru a păstra doar perechile a căror cheie se termină cu "1" și a căror valoare este mai mare decât 10. Afișează rezultatul cu json_encode.
Ieșire: script PHP
Filter an associative array

Filtrarea folosind indicele

În listă, cheia fiecărui cuvânt este poziția lui. Cu ARRAY_FILTER_USE_BOTH predicatul vede cuvântul și indicele lui. Un cuvânt este păstrat doar când indicele lui nu este 0 și are mai puțin de 5 litere.

Prompt
Ia cuvintele one, two, three, four. Folosește array_filter cu ARRAY_FILTER_USE_BOTH, astfel încât predicatul să vadă și poziția. Păstrează un cuvânt doar dacă poziția lui nu este 0 și are mai puțin de 5 litere, apoi reindexează cu array_values și afișează rezultatul cu json_encode.
Ieșire: script PHP
Filter using the index

Filtrarea cu o condiție negată

Eliminăm cuvintele cu 3 litere sau mai puține. Condiția strlen($w) = 3 este negată cu !, așa că rămân doar cuvintele mai lungi.

Prompt
Ia cuvintele one, two, three, four. Folosește array_filter, dar neagă condiția cu ! astfel încât cuvintele cu 3 litere sau mai puține să fie eliminate. Reindexează cu array_values și afișează rezultatul cu json_encode.
Ieșire: script PHP
Filter with a negated condition

Filtrarea după tip

Tabloul conține null, un număr, două șiruri de caractere și un număr real. Funcția de apel inversat is_string(...) este funcția integrată însăși, transmisă cu sintaxa first-class callable. Fiecare șir de caractere păstrat este afișat cu majuscule.

Prompt
Creează un tablou care conține null, 1, "two", 3.5 și "four". Folosește array_filter cu is_string(...) pentru a păstra doar șirurile de caractere. Afișează fiecare șir de caractere păstrat cu majuscule, unul pe linie.
Ieșire: script PHP
Filter by type

Eliminarea valorilor null

Tabloul conține șiruri de caractere și intrări null. Testul explicit $v !== null păstrează valorile reale. Nu apela array_filter() fără o funcție de apel inversat aici: ar elimina orice valoare „falsy”, inclusiv 0, "" și chiar șirul de caractere "0".

Prompt
Creează un tablou care conține null, "one", null și "two". Păstrează valorile care nu sunt null cu array_filter și un test explicit !== null. Reindexează cu array_values și afișează rezultatul cu json_encode.
Ieșire: script PHP
Filter out null values

Partiționarea

Uneori vrei ambele grupuri: elementele care se potrivesc și cele care nu se potrivesc.

PHP nu are un partition integrat. O singură buclă foreach face acest lucru: fiecare element este adăugat cu []= fie în tabloul $match, fie în tabloul $rest. După buclă ai ambele tablouri.

Împărțirea unui tablou în două

Cuvintele mai lungi de 3 litere ajung în $match; toate celelalte ajung în $rest. Ambele tablouri sunt afișate.

Prompt
Scrie un script PHP care împarte cuvintele one, two, three, four în două tablouri cu o singură buclă foreach: cuvintele mai lungi de 3 litere merg în match, toate celelalte în rest. Afișează ambele tablouri cu json_encode.
Ieșire: script PHP
Split an array in two

Testarea predicatelor

Uneori nu ai nevoie de elementele care se potrivesc, ci doar de un răspuns da sau nu.

  • any: trece cel puțin un element testul? array_any(), nou în PHP 8.4, răspunde la această întrebare și se oprește la prima potrivire.
  • none: nu trece niciun element testul? Pune ! în fața lui array_any().
  • all: trece fiecare element testul? array_all(), de asemenea nou în PHP 8.4, răspunde la această întrebare.

Fără o condiție, „există vreun element?” este count($arr) > 0, iar „nu există niciun element?” este count($arr) === 0.

Pe un tablou gol, array_all() returnează true. Nu există niciun element care să nu treacă testul, deci testul nu este niciodată încălcat. Acest lucru se numește adevăr vid.

Exemplele afișează răspunsurile cu json_encode(), care transformă valorile booleene în textul lizibil true și false.

any

Verificăm dacă cel puțin un cuvânt se termină cu "e", apoi verificăm dacă tabloul are vreun element. array_any() se oprește imediat ce "one" trece testul — celelalte cuvinte nu sunt testate.

Prompt
Ia cuvintele one, two, three, four. Folosește array_any pentru a verifica dacă cel puțin un cuvânt se termină cu "e" și afișează răspunsul cu json_encode. Apoi afișează dacă tabloul are vreun element, verificând că count este mai mare decât 0.
Ieșire: script PHP
any

none

Verificăm că niciun cuvânt nu se termină cu "a", apoi verificăm dacă tabloul este gol. array_any() nu găsește nimic și returnează false, așa că ! transformă rezultatul în true.

Prompt
Ia cuvintele one, two, three, four. Folosește ! cu array_any pentru a verifica că niciun cuvânt nu se termină cu "a" și afișează răspunsul cu json_encode. Apoi afișează dacă tabloul este gol, verificând că count este egal cu 0.
Ieșire: script PHP
none

all

Verificăm dacă fiecare cuvânt se termină cu "e". array_all() se oprește la "two" și returnează false. Pe un tablou gol returnează true.

Prompt
Ia cuvintele one, two, three, four. Folosește array_all pentru a verifica dacă fiecare cuvânt se termină cu "e" și afișează răspunsul cu json_encode. Apoi apelează array_all pe un tablou gol cu aceeași condiție și afișează răspunsul.
Ieșire: script PHP
all