Invata PHP cu punctsivirgula.ro

I. Introducere
II. Notiuni de baza
III. Notiuni avansate
IV. Aplicatii
V. Extra
C O N T I N U T
Operatii cu vectori

Operatii cu vectori    6 ! 

Operatiile clasice de cautare, sortare, inserare, etc se pot realiza foarte usor cu ajutorul functiilor specializate, fara sa fie necesara parcurgerea manuala a vectorilor. Iata cateva exemple.

$vector = array( 1, 2, 3, 4, 5, 6 ); $vectAs = array( 'unu' => 'one', 'doi' => 'two', 'trei' => 3 ); // lungimea unui vector (numarul de elemente) print count( $vector ); // 6 // se gaseste o valoare in vector? print in_array( 3, $vector ); // true // exista o anumita cheie in vector? print array_key_exists( 'trei', $vectAs ); // true // returneaza toate cheile din vector: print_r( array_keys( $vectAs ) ); // Array ( [0] => unu [1] => doi [2] => trei ) // returneaza toate valorile din vector: print_r( array_values( $vectAs ) ); // Array ( [0] => one [1] => two [2] => 3 ) // returneaza o parte din vector print_r( array_slice( $vector, 3 ) ); // de la pozitia 3 pana la final: 4, 5, 6 print_r( array_slice( $vector, 3, 2 ) ); // de la pozitia 3, doua elemente: 4, 5 print_r( array_slice( $vector, -5, 3 ) ); // de la final inapoi 5 pozitii: 2, 3, 4 // foloseste cheile unui vector ca variabile: extract( $vectAs ); print $unu; // one print $doi; // two print $trei; // 3 // sorteaza un vector sort( $vector ); // 1, 2, 3, 4, 5, 6 rsort( $vector ); // 6, 5, 4, 3, 2, 1 asort( $vectAs ); // sorteaza valorile si mentine asocierea cheilor // preluare elemente unice din vector print_r( array_unique( $vector ) ); // adauga o valoare la sfarsitul unui vector $vector[] = 7; array_push( $vector, 8 ); # nota: cele 2 instructiuni de mai sus sunt echivalente // modifica un anumit element din vector $vectAs[ 'trei' ] = 'three';
Keloo a spus Problema - 07.08.2012

Am incercat sa "creez" un vector cu elementele trimise printr-un formular


<!--Formularul-->
<html>
<head><title>Fill array</title></head>
<body>
<form action="" method="post">
<input type="text" name="element" />
<input type="submit" value="Update array" />
</form>
</body>
</html>
<hr />

<?php

$element=$_POST["element"];
//daca $vector exista, atunci adauga $element la sfarsit
//daca nu, atunci creez vectorul si afisez "vector gol"
if (isset($vector)) {
array_push($vector,$element);
} else {
$vector=array();
echo "Vector gol";
};
?>

Problema e ca imi afiseaza mereu "Vector gol", e o problema la acel isset.
Ai idee ce are?

Saru'mana

Alexandru a spus Pentru Keloo - 08.08.2012

Salut,

Problema vine de la faptul ca toate variabilele definite in PHP sunt ne-persistente (stateless). Asta inseamna ca ele exista si au o valoare doar cat timp se proceseaza acel script. La terminarea executiei codului PHP valorile se pierd.

Astfel, la o noua procesare a aceluiasi script (adica la un refresh al paginii, cand codul PHP se executa din nou) toate variabilele se reinitializeaza si nu "tin minte" valorile de dinainte.

Asta inseamna ca o navigare printr-un site cu mai multe pagini PHP consta intr-o serie de executii independente ale scripturilor PHP si, in mod normal, o pagina "nu stie" ce variabile s-au definit pe alte pagini, sau la o executie anterioara.

In exemplul tau, cand faci submit la formular se initializeaza variabila $vector, dar la terminarea executiei valoarea ei se pierde. Cand faci un nou submit, se repeta aceeasi poveste, fara ca PHP-ul sa faca vreo legatura intre cele 2 submit-uri.

Acesta este comportamentul implicit. Exista totusi si un mecanism de a persista date de-a lungul navigarii de la o pagina la alta.

Acest mecanism poarta numele de sesiune. Vezi detalii la http://php.punctsivirgula.ro/sesiuni/

Iata mai jos codul modificat ce foloseste sesiuni:

<?php

session_start(); // deschid o sesiune de navigare
$vector = $_SESSION['vect']; // preiau vechea valoare, daca exista


$element=$_POST["element"];
//daca $vector exista, atunci adauga $element la sfarsit
//daca nu, atunci creez vectorul si afisez "vector gol"
if (isset($vector)) {
array_push($vector,$element);
} else {
//$vector=array();
$vector=array($element); // adaug elementul si acum
echo "Vector gol";
};


// la final persist valoarea lui $vector
$_SESSION['vect'] = $vector;

?>

Daniel a spus Print in_Array - 17.01.2014

La aplicarea lui print in_array pentru a vedea daca un anumit element este intr-un sir, imi apare valoarea 1 daca acesta apartine sirului si in cazul in care nu se regaseste in sir nu imi apare nimic. Nu imi apare true sau false. Gresesc undeva? Sau e in regula sa imi apara in felul acesta. Multumesc

Alexandru a spus Pentru Daniel - 17.01.2014

Este in regula sa apara asa pentru ca rezultatul este evaluat ca string atunci cand este afisat. Iar la transformarea in string, valoarea booleana "true" devine "1" iar valoarea "false" devine sirul gol "".

Pentru a afisa o reprezentare mai corecta a valorilor de tip boolean, foloseste var_dump in loc de print.

Daniel a spus sort sir - 18.01.2014

Am incercat sa vad cum functioneaza sort
<?php
$sir = array (2,4,3,7,1,6,8,9,3);
sort($sir);
?>
iar cand ii dau executie nu imi apare nimic. Ar trebui sa mi-l ordoneze crescator sau sa mi-l afiseze pur si simplu asa cum este? Mentionez ca am incercat dupa sort ($sir) am incercat un print ($sir)si imi da o eroare ca si cand nu ar recunoaste ceva...

Daniel a spus scuze - 18.01.2014

Scuze pentru deranj, dar mi-am dat seama intre timp. Am folosit print_r ($sir) pentru siruri si asa mi l-a ordonat inradevar creescator. :)


Adauga un comentariu la aceasta sectiune.

 


Aplicatie: Sa se afiseze tipul browserului folosit de utilizator    5 ! 

Vom folosi variabila predefinita $_SERVER care contine elementul HTTP_USER_AGENT. Acesta contine textul de identificare transmis de browser catre server. Vom cauta in acest text denumirile browserelor cunoscute si vom afisa un mesaj corespunzator.

Pentru inceput definim o lista de browsere cunoscute.

In continuare vom lua fiecare browser si vom verifica daca se afla in textul de identificare al browserului. $b ) { // $b va avea pe rand fiecare valoare din vectorul $browser // $i preprezinta pozitia lui $b in vector if( stristr( $_SERVER[ 'HTTP_USER_AGENT' ], $b ) ) { $gasit = true; print "Folositi {$browser[ $i ]}!
"; } if( $gasit ) break; // opreste cautarea daca browserul a fost identificat } ?>
Rezultatul este afisat mai jos (nota: incercati sa accesati aceasta pagina cu browsere diferite pentru a vedea ca mesajul de schimba):
Mihai a spus stristr - 10.07.2010

ce face functia stristr()?

Piny a spus @Mihai - 09.08.2010

Cand nu sti ce anume face o functie, doar apasa click pe ea in exemplele date si vei gasii acolo toata documentatia de care ai nevoie legata de acea functie.

Bogdan a spus erroare - 21.12.2013

Imi da eroarea "undentified index : HTTP_USER_AGENT "

????CE S INTAMPLA???

Daniel a spus browser - 20.01.2014

if( stristr( $_SERVER[ 'HTTP_USER_AGENT' ], $b ) )
Daca browserul $b se regaseste in $_SERVER[ 'HTTP_USER_AGENT' ]atunci...
e bine cum am inteles acel if? si daca l-am inteles bine s-au nu ce reprezinta $_SERVER[ 'HTTP_USER_AGENT' ]? este cumva un sir?

Alexandru a spus browser - 21.01.2014

Pentru Bogdan:
Probabil browser-ul tau este configurat sa nu transmita identificatorul sau si din acest motiv HTTP_USER_AGENT nu este definit. Acest lucru este perfect valid si un script PHP nu poate controla ce primeste de la un utilizator

Pentru Daniel:
HTTP_USER_AGENT este un text (un string) transmis de browser atunci cand face un request catre server-ul web. Acel string depinde de la aplicatie la aplicatie, dar mai toate browserele transmit numele lor, versiunea si sistemul de operare. Un exemplu de text user-agent este: "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0" - care identifica browserul Firefox, versiunea 26.0 si OS Windows.

In acel script se verifica, pe rand, daca elementele vectorului se gasesc in textul de user-agent, si daca da, este afisat un mesaj. Vezi in manualul PHP ce returneaza functia strstr (http://ro1.php.net/stristr)

Nota: ca sa verifici ce user-agent transmite browser-ul tau, acceseaza site-ul http://whatsmyuseragent.com/


Adauga un comentariu la aceasta sectiune.

 


Depanare    0 ! 

// afisarea unui 'dump' al vectorului - o lista cu toate elementele. //De obicei se foloseste la depanare: print_r( $vectAs ); /* afiseaza Array ( [unu] => one [doi] => two [trei] => 3 ) */ // se afiseaza la fel ca mai sus o lista cu elementele vectorului, doar // ca se specifica si tipul fiecaruia. var_dump( $vectAs ); /* afiseaza array(3) { ["unu"]=> string(3) "one" ["doi"]=> string(3) "two" ["trei"]=> int(3) } */

Nimic de afisat.


Adauga un comentariu la aceasta sectiune.