Treci la conținutul principal

Obținerea părților unei colecții

Uneori nu ai nevoie de un tablou întreg. Ai nevoie de o parte din el: un interval de elemente, primele sau ultimele câteva, bucăți de dimensiune egală sau o fereastră mobilă de vecini.

Unealta de bază pentru asta în PHP este array_slice. array_slice($words, $offset, $length) dă $length elemente, începând de la indicele $offset. Al doilea număr este un număr de elemente, nu un indice de final. Omite $length pentru a merge până la sfârșit. Un $offset negativ numără înapoi de la sfârșit, iar un $length negativ se oprește cu atâtea elemente înainte de sfârșit.

  • array_slice($s, $i, $n) — $n elemente, începând de la indicele $i
  • array_slice($s, 0, $n) — primele $n elemente
  • array_slice($s, $i) — tot, de la indicele $i până la sfârșit
  • array_slice($s, -$n) — ultimele $n elemente
  • array_slice($s, 0, -$n) — tot, în afară de ultimele $n elemente

array_slice construiește întotdeauna un tablou nou și copiază în el elementele alese. Modificarea copiei nu modifică originalul, iar modificarea originalului nu modifică copia. În alte limbaje aceeași operație dă o vedere care împarte memoria cu originalul — în PHP asta nu se întâmplă niciodată.

Pentru bucăți de dimensiune egală PHP are o a doua funcție gata făcută, array_chunk. Pentru sarcinile pe care niciuna dintre aceste funcții nu le poate rezolva singură, lecția folosește o buclă for sau foreach și una sau două funcții ajutătoare mici.

Majoritatea exemplelor din această pagină folosesc aceleași date: cuvintele one two three four five six.


Felie (slice)

A tăia o felie înseamnă a lua elementele de la niște poziții alese.

Pentru o serie de poziții vecine, folosește array_slice: array_slice($words, 1, 3) dă elementele de la indicii 1, 2 și 3. Atenție: 3 este o lungime, nu un indice de final — pornește de la indicele 1 și ia 3 elemente.

array_slice nu poate sări peste elemente. Pentru a lua fiecare al doilea element, folosește o buclă for cu $i += 2. Pentru poziții pe care le enumeri tu, în propria ta ordine, array_map peste un tablou de indici alege elementul de la fiecare dintre ele.

O felie dintr-un interval

array_slice($words, 1, 3) pornește de la indicele 1 și ia 3 elemente: cuvintele de la indicii 1, 2 și 3. Rezultatul este un tablou nou, așa că o modificare a lui nu ar atinge $words. Programul afișează two, three, four.

Prompt
Creează un tablou cu cuvintele one, two, three, four, five, six. Folosește array_slice cu decalajul 1 și lungimea 3 pentru a lua elementele de la indicii 1, 2 și 3. Afișează rezultatul cu implode.
Ieșire: script PHP
Slice a range

O felie cu pas

Pentru a lua fiecare al doilea element, o buclă for cu $i += 2 trece prin indicii 0, 2 și 4 și strânge cuvintele. $part[] = ... adaugă un element la sfârșitul unui tablou.

Prompt
Creează un tablou cu cuvintele one, two, three, four, five, six. Folosește o buclă for care merge de la indicele 0 la indicele 4 cu pasul 2 și adaugă fiecare element într-un tablou nou. Afișează rezultatul cu implode.
Ieșire: script PHP
Slice with a step

O felie după o listă de indici

Pozițiile 3, 5 și 0 sunt păstrate într-un tablou de numere. array_map caută $words[$i] pentru fiecare dintre ele, așa că rezultatul iese în ordinea indicilor: four, six, one.

Prompt
Creează un tablou cu cuvintele one, two, three, four, five, six și un tablou de indici 3, 5, 0. Folosește array_map peste indici pentru a strânge cuvintele de la acele poziții, în această ordine. Afișează rezultatul cu implode.
Ieșire: script PHP
Slice by a list of indices

Take și drop

Take înseamnă a păstra un număr de elemente de la un capăt. Drop înseamnă a arunca un număr de elemente de la un capăt și a păstra restul.

În PHP ambele sunt apeluri la array_slice. array_slice($words, 0, 3) ia primele 3 elemente, iar array_slice($words, -3) ia ultimele 3 — un decalaj negativ numără înapoi de la sfârșit. array_slice($words, 1) aruncă primul element, iar array_slice($words, 0, -5) aruncă ultimele 5, pentru că o lungime negativă se oprește cu atâtea elemente înainte de sfârșit.

Există și variante condiționate: takeWhile, takeLastWhile, dropWhile și dropLastWhile. Acestea nu numără elemente. Ele merg de la un capăt și se opresc la primul element care nu trece o condiție. PHP nu are variante predefinite, așa că o funcție ajutătoare mică, cu o buclă foreach, face treaba — iar variantele Last pur și simplu inversează tabloul cu array_reverse, rulează aceeași funcție ajutătoare și inversează rezultatul la loc.

Ia primele sau ultimele n elemente

array_slice($words, 0, 3) păstrează primele 3 cuvinte. array_slice($words, -3) păstrează ultimele 3, pentru că un decalaj negativ numără înapoi de la sfârșit.

Prompt
Creează un tablou cu cuvintele one, two, three, four, five, six. Folosește array_slice pentru a obține primele 3 elemente și ultimele 3 elemente. Afișează ambele rezultate pe linii separate cu implode.
Ieșire: script PHP
Take the first or last n elements

Aruncă primele sau ultimele n elemente

array_slice($words, 1) sare peste primul cuvânt și păstrează restul. array_slice($words, 0, -5) se oprește cu 5 elemente înainte de sfârșit, așa că rămâne doar one.

Prompt
Creează un tablou cu cuvintele one, two, three, four, five, six. Folosește array_slice pentru a obține tot în afară de primul element și tot în afară de ultimele 5 elemente. Afișează ambele rezultate pe linii separate cu implode.
Ieșire: script PHP
Drop the first or last n elements

Ia atât timp cât o condiție este îndeplinită

takeWhile păstrează cuvintele de la început până întâlnește un cuvânt care începe cu f. str_starts_with() verifică începutul unui șir de caractere. takeLastWhile păstrează cuvintele de la sfârșit până întâlnește three: inversează tabloul cu array_reverse, rulează takeWhile și inversează rezultatul la loc.

Prompt
Scrie funcțiile ajutătoare takeWhile și takeLastWhile, care primesc un tablou și o funcție de condiție. takeWhile păstrează elementele de la început atât timp cât condiția este îndeplinită; takeLastWhile face același lucru dinspre sfârșit, inversând tabloul, rulând takeWhile și inversând rezultatul la loc. Folosește-le pe cuvintele one, two, three, four, five, six: păstrează de la început atât timp cât cuvântul nu începe cu f, iar de la sfârșit atât timp cât cuvântul nu este three. Afișează ambele rezultate.
Ieșire: script PHP
Take while a condition holds

Aruncă atât timp cât o condiție este îndeplinită

dropWhile sare peste cuvintele de 3 litere de la început și păstrează tot de la three încolo. dropLastWhile sare peste cuvintele de la sfârșit atât timp cât acestea conțin litera i. str_contains() verifică dacă un șir de caractere conține o bucată de text.

Prompt
Scrie funcțiile ajutătoare dropWhile și dropLastWhile, care primesc un tablou și o funcție de condiție. dropWhile sare peste elementele de la început atât timp cât condiția este îndeplinită și păstrează restul; dropLastWhile face același lucru dinspre sfârșit. Folosește-le pe cuvintele one, two, three, four, five, six: sari de la început atât timp cât cuvântul are 3 litere, iar de la sfârșit atât timp cât cuvântul conține litera i. Afișează ambele rezultate.
Ieșire: script PHP
Drop while a condition holds

Bucăți (chunked)

A împărți în bucăți înseamnă a tăia un tablou în părți de aceeași dimensiune. Ultima bucată poate fi mai scurtă, când elementele nu se împart exact.

PHP are asta predefinit: array_chunk($numbers, 3) returnează un tablou de tablouri, iar ultima bucată, cea scurtă, iese corect de la sine. Fiindcă rezultatul este imbricat, json_encode îl afișează cu fiecare bucată în parantezele ei: [[0,1,2],[3,4,5],…].

Pentru a lucra imediat cu fiecare bucată, dă bucățile lui array_map: a transmite numele unei funcții predefinite ca șir de caractere, precum 'array_sum', funcționează la fel de bine ca o funcție-săgeată.

Împarte în bucăți de 3

Numerele de la 0 la 13 sunt tăiate în bucăți de 3 cu un singur apel la array_chunk. Ultima bucată are doar 2 elemente: [12,13].

Prompt
Creează un tablou cu numerele de la 0 la 13. Folosește array_chunk pentru a-l împărți în bucăți de 3 și afișează rezultatul cu json_encode.
Ieșire: script PHP
Split into chunks of 3

Adună fiecare bucată

Aceleași bucăți, dar fiecare este adunată cu funcția predefinită array_sum. Numele ei este transmis lui array_map ca șir de caractere. Se păstrează doar sumele: 3, 12, 21, 30, 25.

Prompt
Creează un tablou cu numerele de la 0 la 13. Împarte-l în bucăți de 3 cu array_chunk, adună fiecare bucată aplicând array_sum peste bucăți cu map și afișează tabloul de sume cu implode.
Ieșire: script PHP
Sum each chunk

Ferestre (windowed)

O fereastră este un grup de elemente vecine. Deplasarea ferestrei glisează grupul de-a lungul tabloului și strânge fiecare poziție. Spre deosebire de bucăți, ferestrele se suprapun.

PHP nu are un windowed predefinit. O buclă for care apelează array_slice($items, $i, $size) la fiecare poziție face asta, iar o funcție ajutătoare mică, windowed, o face reutilizabilă. Cu un $step, fereastra se deplasează cu mai multe poziții pe rând. Cu $partial setat pe true, o fereastră mai scurtă de la sfârșit este păstrată în loc să fie aruncată.

O fereastră de 2 care se deplasează cu 1 pas este același lucru cu împerecherea fiecărui element cu următorul. În PHP, array_map cu null în loc de funcție lipește două tablouri element cu element — dă-i tabloul fără ultimul element și tabloul fără primul, și obții perechile de vecini.

Ferestre de 3

Fereastra are 3 cuvinte și se deplasează cu 1 poziție pe rând. Bucla se oprește când o fereastră completă nu mai încape, așa că sunt 3 ferestre. Rezultatul este un tablou de tablouri, afișat cu json_encode.

Prompt
Scrie o funcție ajutătoare windowed, care primește un tablou și o dimensiune de fereastră și returnează fiecare grup de atâtea elemente vecine, deplasându-se cu o poziție pe rând. Folosește-o cu dimensiunea 3 pe cuvintele one, two, three, four, five. Afișează rezultatul cu json_encode.
Ieșire: script PHP
Windows of 3

Ferestre cu pas și ferestre parțiale

Fereastra are 3 numere și se deplasează cu 2 poziții pe rând. Fiindcă $partial este true, ultima fereastră [9,10] este păstrată, chiar dacă este scurtă.

Prompt
Scrie o funcție ajutătoare windowed, care primește un tablou, o dimensiune de fereastră, un pas și un indicator partial. Ea se deplasează cu step poziții între ferestre, iar când partial este true păstrează și o fereastră mai scurtă la sfârșit. Folosește-o pe numerele de la 1 la 10 cu dimensiunea 3, pasul 2 și partial setat pe true. Afișează rezultatul cu json_encode.
Ieșire: script PHP
Windows with a step and partial windows

Adună fiecare fereastră

Fiecare fereastră de 3 vecini este decupată cu array_slice și adunată cu array_sum. Se păstrează doar sumele: 6, 9, 12.

Prompt
Creează un tablou cu numerele de la 1 la 5. Parcurge fiecare fereastră de 3 elemente vecine, adună fiecare fereastră cu array_sum și strânge sumele. Afișează tabloul de sume cu implode.
Ieșire: script PHP
Sum each window

Împerechează fiecare element cu următorul

array_map(null, ...) împerechează fiecare cuvânt cu vecinul său: primului tablou-argument îi lipsește ultimul element, celui de-al doilea îi lipsește primul, așa că tablourile se aliniază ca vecini. A doua buclă compară aceiași vecini și reține dacă primul cuvânt este mai lung decât al doilea; json_encode afișează valorile booleene ca true și false.

Prompt
Creează un tablou cu cuvintele one, two, three, four, five. Împerechează fiecare element cu cel care îl urmează, folosind array_map cu null peste tabloul fără ultimul element și tabloul fără primul element, și afișează tabloul de perechi cu json_encode. Apoi parcurge aceiași vecini și reține dacă primul cuvânt este mai lung decât al doilea. Afișează tabloul de valori booleene cu json_encode.
Ieșire: script PHP
Pair each element with the next one