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';
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):
ce face functia stristr()?
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.
Imi da eroarea "undentified index : HTTP_USER_AGENT "
????CE S INTAMPLA???
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?
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)
}
*/
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
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;
?>
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
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.
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...
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.