La gestione completa di un file sequenziale con i vettori in PHP
ricerca, inserimento, modifica, cancellazione di un record
Ovvero, spiegare i vettori in funzione della gestione di un file sequenziale
Lettura dei record di un file sequenziale
Vediamo cosa accade
Lettura di un record1 Apertura del file (il puntatore si posiziona sul
primo record)
2Lettura del record corrente (quello indicato dal puntatore) e trasferimento in memoria (variabile alfanumerica)
3Spostamento nel vettore
4Adesso i dati sono pronti per elaborazioni (somme/totalizzazioni) o output, dipendentemente dal problema assegnato
Lettura del record successivo
2Lettura del record corrente (quello indicato dal puntatore) e trasferimento in memoria (variabile alfanumerica)
3Spostamento nel vettore
4Adesso i dati sono pronti per elaborazioni (somme/totalizzazioni) o output, dipendentemente dal problema assegnato
Lettura del record successivo
Lettura del record successivo
Lettura del record successivo
Lettura del record successivo
Lettura del record successivo
End of file (eof)
I vettori con PHP
Per creare un vettore si può usare la funzione array(). Ipotizziamo di creare un vettore con i dati anagrafici di una persona (codice, cognome, nome, età,luogo di nascita).
[...]$vRecord = array(1,"Floris","Stefano", 42, "Greve in Chianti");[...]
per visualizzare il contenuto del vettore potrò usare il comando echo
[...]echo $vrecord[1];[...]
I vettori con PHP
Partendo dall'esempio precedente si capisce che i vettori sono anche un'ottima struttura per memorizzare i record.
Il vettore è un tipo di variabile che può essere usata facilmente per conservare i dati di un record.
Per esempio, si può creare un vettore con il numero di elementi corrispondente al numero dei campi del record da ospitare.
lettura di un file sequenziale con PHP
In questo esempio si usa un vettore creato "al volo" per ospitare i record letti da un file (in questo caso vRecord):[...]$nomefile = "clienti.txt"; // assegno nome del file$f = fopen($nomefile, "r"); // apro il file in letturaif ($f) { $record = fgets($f); // leggo primo record while (!eof($f)) { // ciclo fino a fine file
$vRecord = explode("\t",$record); // sposto i campi nel vettore $record = fgets($f); // Leggo record successivo } }[...]
Manca però ancora un passaggio... infatti in questo modo ad ogni lettura si scrive sopra vRecord perdendo il contenuto della lettura precedente.
1 Apertura file (puntatore sul primo record)
2Lettura del record corrente (quello indicato dal puntatore) e trasferimento in memoria (variabile alfanumerica)
3Spostamento nel vettore
4 $vRecord[4] ← 25
25
Non esiste alcun modo per......sovrascivere (modificando il contenuto di
uno o piu' campi) un record presente in un file sequenziale anche se si conosce la posizione
Supponiamo di voler “ringiovanire” Floris Stefano.
1 Apertura file (puntatore sul primo record)
2Lettura del record corrente (quello indicato dal puntatore) e trasferimento in memoria (variabile alfanumerica)
3Spostamento nel vettore
4Scelgo di cancellare il record con codice 4
Tantomeno Non esiste alcun modo per...
...cancellare un record presente in un file sequenziale anche se si
conosce la posizione
Queste operazioni si possono fare in memoria usando vettori (detti
array) e/o matrici.
Vorrebbe dire... collocare in memoria una struttura dati simile a
quella del file ma piu' flessibile?
Esatto!
Modifica e cancellazione di un record
2Lettura del record corrente (quello indicato dal puntatore) e trasferimento in memoria (variabile alfanumerica)
3Spostamento nel vettore
4
Con il sistema visto fino ad adesso il vettore $vRecord, ad ogni nuova
lettura perde il contenuto della lettura precedente...
… in quanto si sovrascrivono i dati con quelli del record appena letto. Risolviamo
salvando i dati in una struttura piu' complessa: un vettore di vettori!.
2Lettura del record corrente (quello indicato dal puntatore) e trasferimento in memoria (variabile alfanumerica)
3Spostamento nel vettore
4
Record dopo record, lettura dopo lettura...
… il vettore di vettori si riempie degli stessi dati contenuti nel file sequenziale.
Cos'ì facendo otteniamo un vettore di 6 elementi
ciascuno dei quali contiene un vettore (che rappresenta il
record con i suoi campi)
[...]$nomefile = "clienti.txt"; // assegno nome del file$f = fopen($nomefile, "r"); // apro il file in lettura$n=0; // uso un contatore di recif ($f) { $record = fgets($f); // leggo primo record $n = $n + 1; // incremento ad ogni lettura while (!eof($f)) { // ciclo fino a fine file
$vRecord = explode("\t",$record); // sposto i campi nel vettore $vScatola[$n] = $vRecord; // salvo il record $record = fgets($f); // Leggo record successivo } }[...] Le modifiche necessarie ad
un ciclo di lettura per salvare i record in un vettore (qui chiamato scatola) sono
minime.
Per visualizzare i dati presenti in un vettore si può usare un ciclo for
[...] // $n rappresenta il numero di elementi in $vScatola For ($x==1;$x<0$n;$x++) { // ciclo fino a fine vettore
Echo “<TR><TD>”; Echo “$vScatola[$x][0]”; // visual. campo 0 del rec. $x esimo
Echo “<\TD><TD>”; Echo “$vScatola[$x][1]”; // visual. campo 1 del rec. $x esimo
Echo “<\TD><TD>”; Echo “$vScatola[$x][2]”; // visual. campo 2 del rec. $x esimo
Echo “<\TD><TD>”; Echo “$vScatola[$x][3]”; // visual. campo 3 del rec. $x esimo Echo “<\TD><\TR>”; } }[...]
Per modificare un campo di un record di cui conosco la posizione o il valore di un
campo si può sempre utilizzare un ciclo for...
Per sovrascrivere un file sequenziale leggendo da un
vettore di vettori si puo' sempre usare un ciclo for...
Per sovrascrivere un file sequenziale leggendo da un vettore di vettori (scatola) e
saltare un record che si vuole eliminare si puo' sempre
usare un ciclo for...
http://www.allwebfree.it/articolo_php_alternativa_database.phphttp://www.allwebfree.it/php_txt.phphttp://win.itispanetti.it/panettistyle/dispense/I%20file%20in%20PHP.pdf