Învăţăm PHP: Despre şiruri (emexlpu de pmlerobă)


Aş mai fi putut prelungi mult partea cu şiruri dar informaţiile de bază sunt acoperite. În rest studiaţi documentaţiile, unde găsiţi informaţii despre fiecare din cele câteva zeci de funcţii pe şiruri. M-am gândit că ar fi în schimb mai interesant să vedem ceva aplicaţii la ce am învăţat. Şi tocmai de aceea vă propun să ameţim literele în cuvinte! Sunt sigur că aţi primit şi Dvs emailuri în care literele din cuvinte erau amestecate, mai puţin prima şi ultima. Drept urmare puteaţi citi ce scrie, pentru că – dacă îmi amintesc bine explicaţia – creierul recunoaşte cuvintele pe blocuri nu neapărat din succesiune. În fine, partea psihologică ne pasionează mai puţin. Haideţi să vedem deci un emexlpu de pmlerobă (adică un exemplu de problemă).

Evident problema este un pretext să ne verificăm cunoştinţele şi să mai învăţăm unele lucruri noi. Pornim deci de la o variabilă text (string) în care avem propoziţia de amestecat. Observaţi că nu am pus semne de punctuaţie, doar cuvintele despărţite de spaţii. Aceasta ne uşurează munca pentru acest exemplu. În linia 4 am apelat la funcţia explode(). Ea „explodează” un text după separatorul care îl indicăm ca prim parametru. Intuiţi astfel ce face explode(„|”,”Ionel|Viorel|Costel”); – ne furnizează un şir cu trei elemente, primul „Ionel”, al doilea „Viorel”, al treilea „Costel”. Este o funcţie foarte utilă. Dintr-un şut avem cuvintele puse fiecare separat în şirul $cuvinte. Imediat după ne pregătim pentru cuvintele „ameţite”, pe care le păstrăm în $cuvintenoi.

[PHP]$propozitie=”Aceasta propozitie este scrisa complet aiurea doar ca prima si ultima litera „.
„sunt conservate iar dumneavoastra ar trebui sa fiti in stare sa o cititi”;
//explodam propozitia in cuvinte
$cuvinte=explode(” „,$propozitie);
$cuvintenoi=array();
foreach($cuvinte as $cuvant){
//prelucram fiecare cuvant
$litere=str_split($cuvant,1);
$litere2=str_split($cuvant,1);
$nrlitere=sizeof($litere);
if($nrlitere>3){
//daca are peste trei litere
$amestec_index=range(1,$nrlitere-2);
shuffle($amestec_index);
for($i=1;$i<$nrlitere-1;$i++) $litere2[$i]=$litere[$amestec_index[$i-1]]; } $cuvintenoi[]=implode("",$litere2); } $propozitienoua=implode(" ",$cuvintenoi); echo '‘.$propozitienoua.’.‘;[/PHP]

Acum să vedem bucla. Luăm fiecare cuvint în parte. Spargem cuvintele în şiruri ce conţin literele cuvintelor. Pentru aceasta folosit str_split(). Această funcţie ia textul indicat ca prim parametru şi îl sparge în bucăţele de mărimea indicată de al doilea parametru. Cum noi am spus 1, va pune în $litere una câte una literele cuvântului $cuvant. Adică „Aceasta” va deveni („A”,”c”,”e”,”a”,”s”,”t”,”a”). Acum trebuie să vedem dacă e cazul să amestecăm literele… sau nu? Cum prima şi ultima literă trebuie să rămână fixate, dacă avem doar trei litere „ameţirea” nu are sens. Dacă cuvântul are peste 3 litere atunci purcedem la amestecare: creăm un şir cu indexurile de amestecat (pentru cuvântul „Aceasta” ar fi (1,2,3,4,5) – am eliminat 0 pentru A şi 6 pentru a, prima şi ultima) şi dăm shuffle(). Acum putem cu aceşti indecşi amestecaţi să recreăm cuvântul: din nou sărim peste poziţiile prima şi ultima, preluând restul. Şi uite aşa avem de exemplu şirul („A”,”a”,”s”,”c”,”e”,”t”,”a”). Ca să îl facem din nou cuvânt, string, text, folosim funcţia implode(). Aceasta va uni elementele şirului într-un string, punând separatorii indicaţi prin primul parametru. Noi am pus vid, deci nu va separa literele cu nimic. Din „Aceasta” vom avea deci „Aasceta”. Tot cu implode() reunim toate cuvintele amestecate şi obţinem propoziţia amestecată. Vreţi să vă convingeţi? Încărcaţi această pagină şi daţi refresh pentru a vedea tot altă amestecare.

Dacă nu aţi înţeles bine ce am făcut mai sus, poate vă ajută graficul de mai jos. Am „spart” deci „Aceasta” în şirul A-c-e-a-s-t-a. Nu ne-am atins de prima şi ultima literă. Ne-a interesat doar partea îngroşată, adică indecşii de la 1 la 5. Aceştia i-am amestecat şi în loc de (1,2,3,4,5) să zicem că am obţinut (3,4,1,2,5). În baza lor am reconstruit cuvântul, dar acum amestecat. A ieşit A-a-s-c-e-t-a.

Să mergem mai departe. Exemplul de mai sus ne-a dat ocazia să folosim nişte funcţii noi, interesante şi utile. Cu funcţia explode() s-ar putea să vă întâlniţi des. Dar vă amintiţi că ea admite un singur parametru ca delimitator? Putem pune ” ” sau „|”, după cum am văzut, dar şi ” – ” sau ce dorim. Problema e că… e unic. Dacă dorim ca propoziţia să aibă şi semne de punctuaţie? Cum spunem: „explodează” propoziţia după spaţii, puncte, virgule şi celelalte? Se poate, dar doar folosind expresii regulare. Ele sunt o chineză pentru mulţi. Mie mi-am devenit ceva mai clare după ce m-am convins cât de valoroase sunt în programare (vedeţi un articol de acum doi ani). Vom folosi o expresie regulară: între paranteze drepte spunem ce poate să fie: \s este pentru spaţii, taburi, enteruri… iar apoi punem specific virgulă, punct, punct şi virgulă, semnul întrebării şi semnul exclamării. Acum funcţia preg_split() ne va furniza cuvintele aşa cum ne-am aştepta (dacă am fi folosit explode() am fi avut cuvântul „aiurea,”, acesta având înainte şi după spaţii).

Buuun. Înainte să amestecăm literele în cuvinte am mai făcut nişte paşi doar de dragul de a atinge noi funcţii. Am unit toate cuvintele, fără semnele de punctuaţie. Le-am respart într-un şir de litere. Am apelat la eliminarea dublurilor, cu array_unique(), şi am sortat rezultatul. Am aflat astfel ce litere sunt folosite în propoziţie (şi câte). Cum fiecare rezultat intermediar este afişat, nu detaliez. Veţi vedea şi înţelege mai multe rulând codul.

[PHP]$propozitie=”Aceasta propozitie este scrisa complet aiurea, doar ca prima si ultima litera „.
„sunt conservate! Culmea, dumneavoastra ar trebui sa fiti in stare sa o cititi. Exista o „.
„explicatie stiintifica pentru aceasta, dar nu e cazul sa o punem aici.”;
//explodam propozitia in cuvinte
$cuvinte=preg_split(„/[\s,.:;?!]+/”,strtolower($propozitie));
$sirul=implode(„”,$cuvinte);
$litere=str_split($sirul,1);
echo ‘Toate: ‘.$sirul.’
‘;
$litere=array_unique($litere);
echo ‘Distincte: ‘.implode(„”,$litere).’
‘;
sort($litere);
echo ‘Distincte sortate: ‘.implode(„”,$litere).’
‘;
echo ‘S-au folosit ‘.sizeof($litere).’ litere.

‘;
//re-explodam propozitia in cuvinte
$cuvinte=preg_split(„/[\s,.:;?!]+/”,$propozitie);
foreach($cuvinte as $cuvant){
//prelucram fiecare cuvant
$litere=str_split($cuvant,1);
$litere2=str_split($cuvant,1);
$nrlitere=sizeof($litere);
if($nrlitere>3){
//daca are peste trei litere
$amestec_index=range(1,$nrlitere-2);
shuffle($amestec_index);
for($i=1;$i<$nrlitere-1;$i++) $litere2[$i]=$litere[$amestec_index[$i-1]]; } $cuvantnou=implode("",$litere2); $propozitie=str_replace($cuvant,$cuvantnou,$propozitie); } echo '‘.$propozitie.’‘;[/PHP]

Apropo: codul de mai sus poate fi văzut în acţiune de aici. Şi acum să revedem amestecarea de la care am pornit. Acum avem deci cuvintele, ca înainte, dar ele nu mai sunt despărţite doar de spaţii, ci pot fi şi semne de punctuaţie. Tocmai de aceea, cum am „ameţit” un cuvânt îl vom şi pune în locul cuvântului iniţial. Facem aşa pas cu pas şi la final afişăm rezultatul. Yep, merge! Reîncărcaţi pagina şi veţi vedea tot felul de variante. Cu aceasta am încheiat discuţiile despre array-uri, şiruri, tablouri sau cum doriţi să le spuneţi.


Apreciază articolul:

1 stea2 stea3 stea4 stea5 stea (1 evaluări, media: 5,00 din 5)
Loading...Loading...

0 comentarii


Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile necesare sunt marcate *