3. Le basi di PHP
3.1. Un primo esempio
Di seguito è riportato un programma che illustra le funzionalità di base di PHP.
3.1.1. Il programma (example_01)
<?php
// this is a comment
// variable used without being declared
$nom = "dupont";
// a screen display
print "nom=$nom\n";
// an array with elements of different types
$tableau = array("un", "deux", 3, 4);
// its number of elements
$n = count($tableau);
// a loop
for ($i = 0; $i < $n; $i++)
print "tableau[$i]=$tableau[$i]\n";
// initialize 2 variables with the contents of an array
list($chaine1, $chaine2) = array("chaine1", "chaine2");
// concatenation of the 2 strings
$chaine3 = $chaine1 . $chaine2;
// result display
print "[$chaine1,$chaine2,$chaine3]\n";
// use function
affiche($chaine1);
// the type of a variable can be known
afficheType($n);
afficheType($chaine1);
afficheType($tableau);
// the type of a variable can change at runtime
$n = "a changé";
afficheType($n);
// a function can return a result
$res1 = f1(4);
print "res1=$res1\n";
// a function can return a table of values
list($res1, $res2, $res3) = f2();
print "(res1,res2,res3)=[$res1,$res2,$res3]\n";
// we could have retrieved these values in a table
$t = f2();
for ($i = 0; $i < count($t); $i++)
print "t[$i]=$t[$i]\n";
// testing
for ($i = 0; $i < count($t); $i++)
// displays only channels
if (getType($t[$i]) == "string")
print "t[$i]=$t[$i]\n";
// other tests
for ($i = 0; $i < count($t); $i++){
// displays only integers >10
if (getType($t[$i]) == "integer" and $t[$i] > 10)
print "t[$i]=$t[$i]\n";
}
// a while loop
$t = array(8, 5, 0, -2, 3, 4);
$i = 0;
$somme = 0;
while ($i < count($t) and $t[$i] > 0) {
print "t[$i]=$t[$i]\n";
$somme+=$t[$i]; //$s//$somme=$somme+$t[$i]
$i++; //$i=$i+1
}
print "somme=$somme\n";
// end of program
exit;
//----------------------------------
function affiche($chaine) {
// displays $chaine
print "chaine=$chaine\n";
}
//----------------------------------
function afficheType($variable) {
// displays the type of $variable
print "type[$variable]=" . getType($variable) . "\n";
}
//----------------------------------
function f1($param) {
// adds 10 to $param
return $param + 10;
}
//----------------------------------
function f2() {
// returns 3 values
return array("un", 0, 100);
}
?>
I risultati:
Commenti
- Riga 5: In PHP, i tipi delle variabili non vengono dichiarati. Le variabili hanno un tipo dinamico che può cambiare nel tempo
- $name rappresenta la variabile con l'identificatore name
- Riga 8: Per visualizzare del testo sullo schermo, è possibile utilizzare l'istruzione print o l'istruzione echo
- Riga 11: La parola chiave
*array*viene utilizzata per definire un array. La variabile$name[$i]rappresenta l'$i-esimo elemento dell'array$array. - Riga 14: la funzione count($tableau) restituisce il numero di elementi nell'array $tableau
- Riga 18: le stringhe sono racchiuse tra virgolette doppie " o virgolette singole '. All'interno delle virgolette doppie, le variabili $variable vengono valutate, ma non all'interno delle virgolette singole.
- riga 21: la funzione list consente di raggruppare le variabili in una lista e di assegnare loro un valore con una singola operazione di assegnazione. In questo caso, $string1="string1" e $string2="string2".
- riga 24: l'operatore . è l'operatore di concatenazione delle stringhe.
- riga 88: la parola chiave function definisce una funzione. Una funzione può restituire o meno valori utilizzando l'istruzione return. Il codice chiamante può ignorare o recuperare i risultati di una funzione. Una funzione può essere definita in qualsiasi punto del codice.
- Riga 90: la funzione predefinita getType($variable) restituisce una stringa che rappresenta il tipo di $variable. Questo tipo può cambiare nel tempo.
- Riga 79: la funzione predefinita exit termina lo script.
3.2. Ambito delle variabili
3.2.1. Programma 1 (example_02)
<?php
// variable scope
function f1() {
// we use the global variable $i
$i = &$GLOBALS["i"];
$i++;
$j = 10;
print "f1[i,j]=[$i,$j]\n";
}
function f2() {
// we use the global variable $i
$i = &$GLOBALS["i"];
$i++;
$j = 20;
print "f2[i,j]=[$i,$j]\n";
}
function f3() {
// we use a local variable $i
$i = 4;
$j = 30;
print "f3[i,j]=[$i,$j]\n";
}
// tests
$i = 0;
$j = 0; /// these two variables are known to a function f via the table $GLOBALS
f1();
f2();
f3();
print "test[i,j]=[$i,$j]\n";
?>
I risultati:
Commenti
- Righe 29–30: definiscono due variabili, $i e $j, nel programma principale. Queste variabili non sono note all'interno delle funzioni. Pertanto, alla riga 9, la variabile $j nella funzione f1 è una variabile locale della funzione f1 ed è diversa dalla variabile $j nel programma principale. Una funzione può accedere a una variabile $variable dal programma principale tramite un array di variabili globali chiamato $GLOBALS. Alla riga 7, la notazione $GLOBALS["i"] si riferisce alla variabile globale $i del programma principale. Se scriviamo
alla variabile locale $i viene assegnato il valore della variabile globale $i. Si tratta di due variabili diverse e la modifica della variabile locale $i non modificherà la variabile globale $i. La notazione
fa sì che la variabile locale $i abbia lo stesso indirizzo di memoria della variabile globale $i. Manipolare la variabile locale $i equivale quindi a manipolare la variabile globale $i.
3.2.2. Programma 2 (example_03)
<?php
// the scope of a variable is global to code blocks
$i = 0; {
$i = 4;
$i++;
}
print "i=$i\n";
?>
I risultati:
Commenti
In alcuni linguaggi, una variabile definita tra parentesi graffe ha un ambito limitato a quelle parentesi: non è accessibile al di fuori di esse. I risultati sopra riportati mostrano che questo non è il caso in PHP. La variabile $i definita alla riga 5 all'interno delle parentesi graffe è la stessa di quella utilizzata alle righe 4 e 8 al di fuori di esse.
3.3. Array
3.3.1. Array classici unidimensionali (esempio_04)
<?php
// classic paintings
// initialization
$tab1 = array(0, 1, 2, 3, 4, 5);
// routes - 1
print "tab1 a " . count($tab1) . " éléments\n";
for ($i = 0; $i < count($tab1); $i++)
print "tab1[$i]=$tab1[$i]\n";
// routes - 2
print "tab1 a " . count($tab1) . " éléments\n";
reset($tab1);
while (list($clé, $valeur) = each($tab1))
print "tab1[$clé]=$valeur\n";
// add elements
$tab1[] = $i++;
$tab1[] = $i++;
// routes - 3
print "tab1 a " . count($tab1) . " éléments\n";
$i = 0;
foreach ($tab1 as $élément) {
print "tab1[$i]=$élément\n";
$i++;
}
// delete last item
array_pop($tab1);
// routes - 4
print "tab1 a " . count($tab1) . " éléments\n";
for ($i = 0; $i < count($tab1); $i++)
print "tab1[$i]=$tab1[$i]\n";
// delete first element
array_shift($tab1);
// routes - 5
print "tab1 a " . count($tab1) . " éléments\n";
for ($i = 0; $i < count($tab1); $i++)
print "tab1[$i]=$tab1[$i]\n";
// addition at end of table
array_push($tab1, -2);
// routes - 6
print "tab1 a " . count($tab1) . " éléments\n";
for ($i = 0; $i < count($tab1); $i++)
print "tab1[$i]=$tab1[$i]\n";
// addition at the beginning of the table
array_unshift($tab1, -1);
// routes - 7
print "tab1 a " . count($tab1) . " éléments\n";
for ($i = 0; $i < count($tab1); $i++)
print "tab1[$i]=$tab1[$i]\n";
?>
I risultati:
Commenti
Il programma sopra riportato illustra le operazioni per la manipolazione di un array di valori. In PHP esistono due notazioni per gli array:
L'array 1 è chiamato array, mentre l'array 2 è chiamato dizionario, dove gli elementi sono indicati come chiave => valore. La notazione $opposites["beautiful"] si riferisce al valore associato alla chiave "beautiful". In questo caso, tale valore è la stringa "ugly". L'array 1 è semplicemente una variante del dizionario e potrebbe essere scritto come:
Quindi, abbiamo $array[2]="three". In definitiva, esistono solo dizionari. Nel caso di un array classico di n elementi, le chiavi sono i numeri interi nell'intervallo [0,n-1].
- Riga 15: La funzione each($array) consente di iterare su un dizionario. Ad ogni chiamata, restituisce una coppia (chiave, valore) contenuta al suo interno.
- Riga 14: La funzione reset($dictionary) imposta la funzione each sulla prima coppia (chiave, valore) nel dizionario.
- Riga 15: il ciclo while si interrompe quando la funzione each restituisce una coppia vuota alla fine del dizionario.
- Riga 19: la notazione $array[]=value aggiunge il valore dell'elemento come ultimo elemento di $array.
- riga 25: l'array viene iterato utilizzando un foreach. Questa sintassi consente di iterare su un dizionario, e quindi su un array, utilizzando due sintassi:
La prima sintassi restituisce una coppia (chiave, valore) ad ogni iterazione, mentre la seconda restituisce solo l'elemento valore del dizionario.
- Riga 31: la funzione array_pop($array) rimuove l'ultimo elemento da $array
- riga 39: la funzione array_shift($array) rimuove il primo elemento da $array
- riga 47: la funzione array_push($array,value) aggiunge value come ultimo elemento di $array
- riga 39: la funzione array_unshift($array,value) aggiunge value come primo elemento di $array
3.3.2. Il dizionario (example_05)
<?php
// dictionaries
$conjoints = array("Pierre" => "Gisèle", "Paul" => "Virginie", "Jacques" => "Lucette", "Jean" => "");
// routes - 1
print "Nombre d'éléments du dictionnaire : " . count($conjoints) . "\n";
reset($conjoints);
while (list($clé, $valeur) = each($conjoints))
print "conjoints[$clé]=$valeur\n";
// dictionary sorting on key
ksort($conjoints);
// routes - 2
reset($conjoints);
while (list($clé, $valeur) = each($conjoints))
print "conjoints[$clé]=$valeur\n";
// list of dictionary keys
$clés = array_keys($conjoints);
for ($i = 0; $i < count($clés); $i++)
print "clés[$i]=$clés[$i]\n";
// list of dictionary values
$valeurs = array_values($conjoints);
for ($i = 0; $i < count($valeurs); $i++)
print "valeurs[$i]=$valeurs[$i]\n";
// key search
existe($conjoints, "Jacques");
existe($conjoints, "Lucette");
existe($conjoints, "Jean");
// deleting a key-value
unset($conjoints["Jean"]);
print "Nombre d'éléments du dictionnaire : " . count($conjoints) . "\n";
foreach ($conjoints as $clé => $valeur) {
print "conjoints[$clé]=$valeur\n";
}
// end
exit;
function existe($conjoints, $mari) {
// checks whether the key $mari exists in the dictionary $conjoints
if (isset($conjoints[$mari]))
print "La clé [$mari] existe associée à la valeur [$conjoints[$mari]]\n";
else
print "La clé [$mari] n'existe pas\n";
}
?>
I risultati:
Commenti
Il codice sopra riportato applica a un dizionario ciò che abbiamo visto in precedenza per un semplice array. Ci limiteremo a commentare le nuove funzionalità:
- riga 13: la funzione ksort (ordinamento per chiave) ordina un dizionario secondo l'ordine naturale delle chiavi.
- riga 21: la funzione array_keys($dictionary) restituisce l'elenco delle chiavi del dizionario sotto forma di array
- riga 26: la funzione array_values($dictionary) restituisce l'elenco dei valori del dizionario sotto forma di array
- riga 47: la funzione isset($variable) restituisce true se $variable è stata definita, false in caso contrario.
- Riga 36: la funzione unset($variable) elimina la $variable.
3.3.3. Array multidimensionali (esempio_06)
<?php
// classic multidimensional tables
// initialization
$multi = array(array(0, 1, 2), array(10, 11, 12, 13), array(20, 21, 22, 23, 24));
// route
for ($i1 = 0; $i1 < count($multi); $i1++)
for ($i2 = 0; $i2 < count($multi[$i1]); $i2++)
print "multi[$i1][$i2]=" . $multi[$i1][$i2] . "\n";
// multidimensional dictionaries
// initialization
$multi = array("zéro" => array(0, 1, 2), "un" => array(10, 11, 12, 13), "deux" => array(20, 21, 22, 23, 24));
// route
foreach ($multi as $clé => $valeur)
for ($i2 = 0; $i2 < count($valeur); $i2++)
print "multi[$clé][$i2]=" . $multi[$clé][$i2] . "\n";
?>
Risultati:
Commenti
- riga 5: gli elementi dell'array $multi sono essi stessi array
- riga 12: l'array $multi diventa un dizionario (chiave, valore) in cui ogni valore è un array
3.3.4. Collegamenti tra stringhe e array (esempio_07)
<?php
// string to array
$chaine = "1:2:3:4";
$tab = explode(":", $chaine);
// parcours tableau
print "tab a " . count($tab) . " éléments\n";
for ($i = 0; $i < count($tab); $i++)
print "tab[$i]=$tab[$i]\n";
// table to string
$chaine2 = implode(":", $tab);
print "chaine2=$chaine2\n";
// add an empty field
$chaine.=":";
print "chaîne=$chaine\n";
$tab = explode(":", $chaine);
// parcours tableau
print "tab a " . count($tab) . " éléments\n";
for ($i = 0; $i < count($tab); $i++)
print "tab[$i]=$tab[$i]\n"; //// we now have 5 elements, the last being empty
// let's add another empty field
$chaine.=":";
print "chaîne=$chaine\n";
$tab = explode(":", $chaine);
// parcours tableau
print "tab a " . count($tab) . " éléments\n";
for ($i = 0; $i < count($tab); $i++)
print "tab[$i]=$tab[$i]\n"; //// we now have 6 elements, the last two being empty
?>
Risultati:
Commenti
- Riga 5: La funzione explode($separator,$string) recupera i campi di $string separati da $separator. Pertanto, explode(":",$string) restituisce gli elementi di $string separati dalla stringa ":" sotto forma di array.
- La funzione implode($separator,$array) esegue l'operazione opposta rispetto alla funzione explode. Restituisce una stringa composta dagli elementi di $array separati da $separator.
3.4. Stringhe
3.4.1. Sintassi (esempio_08)
<?php
// string notation
$chaine1 = "un";
$chaine2 = 'un';
print "[$chaine1,$chaine2]\n";
?>
Risultati:
3.4.2. Confronto (esempio_09)
<?php
// string comparison tests
compare("abcd", "abcd");
compare("", "");
compare("1", "");
exit;
function compare($chaine1, $chaine2) {
// compare string1 and string2
if ($chaine1 == $chaine2)
print "[$chaine1] est égal à [$chaine2]\n";
else
print "[$chaine1] est différent de [$chaine2]\n";
}
?>
Risultati:
3.5. Espressioni regolari (esempio_10)
<?php
// regular expression in PHP
// retrieve the various fields of a string
// the model: a sequence of numbers surrounded by any characters
// you only want to retrieve the sequence of digits
$modèle = "/(\d+)/";
// the chain is compared with the
compare($modèle, "xyz1234abcd");
compare($modèle, "12 34");
compare($modèle, "abcd");
// the model: a sequence of numbers surrounded by any characters
// we want the sequence of numbers and the fields that follow and precede them
$modèle = "/^(.*?)(\d+)(.*?)$/";
// the chain is compared with the
compare($modèle, "xyz1234abcd");
compare($modèle, "12 34");
compare($modèle, "abcd");
// the template - a date in dd/mm/yy format
$modèle = "/^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$/";
compare($modèle, "10/05/97");
compare($modèle, " 04/04/01 ");
compare($modèle, "5/1/01");
// the model - a decimal number
$modèle = "/^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*/";
compare($modèle, "187.8");
compare($modèle, "-0.6");
compare($modèle, "4");
compare($modèle, ".6");
compare($modèle, "4.");
compare($modèle, " + 4");
// end
exit;
// --------------------------------------------------------------------------
function compare($modèle, $chaîne) {
// compares the $chaîne string with the $modèle model
// the chain is compared with the model
$correspond = preg_match($modèle, $chaîne, $champs);
// displaying results
print "\nRésultats($modèle,$chaîne)\n";
if ($correspond) {
for ($i = 0; $i < count($champs); $i++)
print "champs[$i]=$champs[$i]\n";
} else
print "La chaîne [$chaîne] ne correspond pas au modèle [$modèle]\n";
}
?>
Risultati:
Commenti
- Righe 3-4: Qui utilizziamo le espressioni regolari per estrarre i vari campi da una stringa. Le espressioni regolari ci consentono di superare i limiti della funzione implode. Il principio consiste nel confrontare una stringa con un'altra stringa, detta pattern, utilizzando la funzione preg_match:
$correspond = preg_match($modèle, $chaîne, $champs);
La funzione preg_match restituisce un valore booleano che indica se il modello è presente nella stringa. In tal caso, $fields[0] rappresenta la sottostringa che corrisponde al modello. Inoltre, se il modello contiene sottomodelli racchiusi tra parentesi, $champs[1] è la porzione di $string corrispondente al primo sottomodello, $champs[2] è la porzione di $string corrispondente al secondo sottomodello e così via...
Consideriamo il primo esempio. Il pattern è definito alla riga 8: indica una sequenza di una o più (+) cifre (\d) situate in qualsiasi punto della stringa. Inoltre, il pattern definisce un sottopattern racchiuso tra parentesi.
- Riga 10: il pattern /(\d+)/ (una sequenza di una o più cifre in qualsiasi punto della stringa) viene confrontato con la stringa "xyz1234abcd". Vediamo che la sottostringa 1234 corrisponde al pattern. Pertanto, $fields[0] sarà uguale a "1234". Inoltre, il pattern ha sottopattern racchiusi tra parentesi. Avremo $champs[1]="1234".
- Riga 11: Il pattern /(\d+)/ viene confrontato con la stringa "12 34". Vediamo che le sottostringhe 12 e 34 corrispondono al pattern. Il confronto si ferma alla prima sottostringa che corrisponde al pattern. Pertanto, $champs[0] = 12 e $champs[1] = 12.
- Riga 12: Il pattern /(\d+)/ viene confrontato con la stringa "abcd". Non viene trovata alcuna corrispondenza.
Spieghiamo i pattern utilizzati nel resto del codice:
$modèle = "/^(.*?)(\d+)(.*?)$/";
inizio della stringa (^), poi 0 o più (*) caratteri arbitrari (.), poi 1 o più (+) cifre, poi di nuovo 0 o più (*) caratteri arbitrari (.). Il pattern (.*) indica 0 o più caratteri arbitrari. Un pattern di questo tipo corrisponderà a qualsiasi stringa. Pertanto, il modello /^(.*)(\d+)(.*)$/ non verrà mai trovato perché il primo sottomodello (.*) consumerà l'intera stringa. Il modello (.*?)(\d+) indica 0 o più caratteri arbitrari fino al sottomodello successivo (?), in questo caso \d+. Pertanto, le cifre non vengono più catturate dal modello (.*). Il modello sopra riportato corrisponde quindi a [inizio della stringa (^), una sequenza di caratteri qualsiasi (.*?), una sequenza di una o più cifre (\d+), una sequenza di caratteri qualsiasi (.*?), fine della stringa ($)].
$modèle = "/^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$/";
corrisponde a [inizio della stringa (^), 2 cifre (\d\d), il carattere / (\/), 2 cifre, /, 2 cifre, una sequenza di 0 o più spazi (\s*), fine della stringa ($)]
$modèle = "/^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*/";
[inizio della stringa (^), 0 o più spazi (\s*), un segno + o - [+|-] che ricorre 0 o 1 volta (?), una sequenza di 0 o più spazi (\s*), 1 o più cifre seguite da un punto decimale seguito da zero o più cifre (\d+\.\d*) oppure (|) un punto decimale (\.) seguito da una o più cifre (\d+) oppure (|) una o più cifre (\d+), una sequenza di 0 o più spazi (\s*)].
3.6. Modalità di passaggio dei parametri di funzione (esempio_11)
<?php
// parameter step mode
function f(&$i, $j) {
// $i will be obtained by reference
// $j will be obtained by value
$i++;
$j++;
print "f[i,j]=[$i,$j]\n";
}
// ----------------------------------------tests
$i = 0;
$j = 0;
// $i and $j passed by values
f($i, $j);
print "test[i,j]=[$i,$j]\n";
?>
Risultati:
Commenti
Il codice sopra riportato illustra i due modi di passare i parametri a una funzione. Consideriamo il seguente esempio:
- riga 1: definisce i parametri formali $a e $b della funzione f. Questa funzione manipola questi due parametri formali e restituisce un risultato.
- riga 7: chiama la funzione f con due parametri effettivi $i e $j. I legami tra i parametri formali ($a, $b) e i parametri effettivi ($i, $j) sono definiti dalla riga 7
- &$a: il simbolo & indica che il parametro formale $a assumerà il valore dell'indirizzo del parametro effettivo $i. In altre parole, $a e $i sono due riferimenti alla stessa posizione di memoria. Manipolare il parametro formale $a equivale a manipolare il parametro effettivo $i. Ciò è dimostrato dall'esecuzione del codice. Questo metodo di passaggio è adatto per i parametri di output e per grandi insiemi di dati come array e dizionari. Questo metodo di passaggio è chiamato pass-by-reference.
- $b: Il parametro formale $b assumerà il valore del parametro effettivo $j. Si tratta di un passaggio per valore. I parametri formali ed effettivi sono due variabili diverse. La manipolazione del parametro formale $b non ha alcun effetto sul parametro effettivo $j. Ciò è dimostrato dall'esecuzione del codice. Questa modalità di passaggio è adatta per i parametri di input.
- Consideriamo la funzione swap, che accetta due parametri formali $a e $b. La funzione scambia i valori di questi due parametri. Pertanto, durante una chiamata a swap($i,$j), il codice chiamante si aspetta che i valori dei due parametri effettivi vengano scambiati. Si tratta quindi di parametri di output (vengono modificati). Scriveremo quindi:
3.7. Risultati restituiti da una funzione (esempio_12)
<?php
// results rendered by a function
// a function can return several values in an array
list($res1, $res2, $res3) = f1(10);
print "[$res1,$res2,$res3]\n";
$res = f1(10);
for ($i = 0; $i < count($res); $i++)
print "res[$i]=$res[$i]\n";
// a function can render a pseudo-object
$res = f2(10);
print "[$res->res1,$res->res2,$res->res3]\n";
// end
exit;
// function f1
function f1($valeur) {
// returns an array ($valeur+1,$aleur+2,$baleur+3)
return array($valeur + 1, $valeur + 2, $valeur + 3);
}
// function f2
function f2($valeur) {
// renders a pseudo-object ($valeur+1,$aleur+2,$baleur+3)
$res->res1 = $valeur + 1;
;
$res->res2 = $valeur + 2;
$res->res3 = $valeur + 3;
// makes the object
return $res;
}
?>
Risultati
Commenti
- Il programma precedente mostra che una funzione PHP può restituire un insieme di risultati anziché uno solo, sotto forma di array o oggetto. Il concetto di oggetto è spiegato più dettagliatamente di seguito
- righe 19–22: la funzione f1 restituisce più valori sotto forma di array
- righe 25–33: la funzione f2 restituisce più valori sotto forma di oggetto
3.8. File di testo (esempio_13)
<?php
// sequential operation of a text file
// this is a set of lines of the form login:pwd:uid:gid:infos:dir:shell
// each line is put into a dictionary in the form login => uid:gid:infos:dir:shell
// set the file name
$INFOS = "infos.txt";
// we open it in creation
if (!$fic = fopen($INFOS, "w")) {
print "Erreur d'ouverture du fichier $INFOS en écriture\n";
exit;
}
// generate arbitrary content
for ($i = 0; $i < 100; $i++)
fputs($fic, "login$i:pwd$i:uid$i:gid$i:infos$i:dir$i:shell$i\n");
// close the file
fclose($fic);
// we use it - fgets keeps the end-of-line marker
// this prevents the retrieval of an empty string when reading a blank line
// we open it in creation
if (!$fic = fopen($INFOS, "r")) {
print "Erreur d'ouverture du fichier $INFOS en lecture\n";
exit;
}
while ($ligne = fgets($fic, 1000)) {
// delete the end-of-line marker if it exists
$ligne = cutNewLineChar($ligne);
// put the line in a table
$infos = explode(":", $ligne);
// retrieve login
$login = array_shift($infos);
// we neglect the pwd
array_shift($infos);
// create a dictionary entry
$dico[$login] = $infos;
}
// close it
fclose($fic);
// using the dictionary
afficheInfos($dico, "login10");
afficheInfos($dico, "X");
// end
exit;
// --------------------------------------------------------------------------
function afficheInfos($dico, $clé) {
// displays the value associated with key in the $dico dictionary if it exists
if (isset($dico[$clé])) {
// value exists - is it a painting?
$valeur = $dico[$clé];
if (is_array($valeur)) {
print "[$clé," . join(":", $valeur) . "]\n";
} else {
// $valeur is not an array
print "[$clé,$valeur]\n";
}
} else {
// $clé is not a key in the $dico dictionary
print "la clé [$clé] n'existe pas\n";
}
}
// --------------------------------------------------------------------------
function cutNewLinechar($ligne) {
// delete the end-of-line mark from $ligne if it exists
$L = strlen($ligne); // // line length
while (substr($ligne, $L - 1, 1) == "\n" or substr($ligne, $L - 1, 1) == "\r") {
$ligne = substr($ligne, 0, $L - 1);
$L--;
}
// end
return($ligne);
}
?>
Il file infos.txt:
login0:pwd0:uid0:gid0:infos0:dir0:shell0
login1:pwd1:uid1:gid1:infos1:dir1:shell1
login2:pwd2:uid2:gid2:infos2:dir2:shell2
...
login98:pwd98:uid98:gid98:infos98:dir98:shell98
login99:pwd99:uid99:gid99:infos99:dir99:shell99
I risultati:
Commenti
- Riga 11: fopen(filename, "w") apre il file filename in scrittura (w = write). Se il file non esiste, viene creato. Se esiste, il suo contenuto viene cancellato. Se la creazione non va a buon fine, fopen restituisce false. Nell'istruzione if (!$fic = fopen($INFOS, "w")) {…}, ci sono due operazioni successive: 1) $fic=fopen(..) 2) if( ! $fic) {...}
- Riga 18: fputs($fic,$string) scrive string nel file $fic.
- Riga 20: fclose($fic) chiude il file $fic.
- Riga 25: fopen(filename, "r") apre il file filename in lettura (r=read). Se l'apertura fallisce (il file non esiste), fopen restituisce un valore falso.
- riga 29: fgets($fic,1000) legge la riga successiva del file, limitata a 1000 caratteri. Nell'operazione while ($line = fgets($fic, 1000)) {…}, ci sono due operazioni successive: 1) $line = fgets(...) 2) while ( ! $line). Dopo che l'ultimo carattere del file è stato letto, la funzione fgets restituisce una stringa vuota e il ciclo while si interrompe.
- Riga 31: La funzione fgets legge una riga di testo, compreso il carattere di nuova riga. La funzione cutNewLineChar nelle righe 70–79 rimuove qualsiasi carattere di nuova riga.
- Riga 72: la funzione strlen($string) restituisce il numero di caratteri in $string.
- Riga 73: La funzione substr($line, $position, $size) restituisce $size caratteri da $line, a partire dal carattere #$position, dove il primo carattere è #0. Su macchine Windows, il marcatore di fine riga è "\r\n". Su macchine Unix, è la stringa "\n".
- Riga 35: la funzione array_shift($array) rimuove il primo elemento da $array e lo restituisce come risultato.
- Riga 37: viene utilizzata la funzione array_shift($array), ma il suo risultato viene ignorato
- Riga 57: La funzione is_array($variable) restituisce true se $variable è un array, false in caso contrario.
- Riga 58: La funzione join fa la stessa cosa della funzione implode che abbiamo visto in precedenza