In questa pillola trattiamo la ricerca su un file di testo in cui è contenuto un vettore.
Come spiegato già da boomboom69 in questa pagina si può sovrascrivere sui file di testo in questa maniera:
Poniamo di avere uno o più file txt con all'interno un vettore che ogni volta viene caricato con i dati che vogliamo. Faccio l'esempio del file che tratteremo, testi.txt. Il file originale sarà:Codice PHP:
$fp = fopen("testi.txt", "a");
fputs($fp, 'Dati che vogliamo immettere');
fclose($fp);
da notare che non serve chiudere il file con ?>Codice PHP:
<?php $testi = array();
Alcuni si domanderanno il perchè su i file di testo ci devono essere vettori. La risposta è semplice: praticità e semplicità di script. Se si lavora abbastanza con i file di testo si può notare che questo è un metodo rapido e veloce.
Ogni volta che ci aggiungeremo dati (che sono di qualsiasi genere, nel nostro caso, testi e non singole parole) il nostro vettore si implementerà in questa maniera (vado a capo solo per problemi di impaginazione)
ponendo particolare attenzione che quando andiamo a sovrascrivere sul file di testo dobbiamo aggiungere gli backslash conCodice PHP:
<?php $testi = array();
$testi[] = 'ciao a tutti, pillola del 25 agosto';
$testi[] = 'discutine sul forum di html.it';
$testi[] = 'asp: se lo conosci lo eviti';
$testi[] = 'http://freephp.html.it risorse free su php per webmaster. Vieni a scoprire le novità';
addslashes altrimenti ci troviamo un bell'apice che darà sicuramente errore.
A questo punto dobbiamo costruire il form html con la parola da ricercare indirizzandolo verso risultati.php che conterrà il seguente script (all'input del form ho dato name="parola").
Prima parte: verifica dell'avvenuto invio tramite metodo post della parola da ricercare. Inoltre verifico che la parola non sia composta di soli spazi.
Seconda parte: tutto lo script che andrà dentro alla condizione IF appena vista. Cominciamo col settare un po di variabili e a includere il file txt che contiene il testo per la ricerca...Codice PHP:
isset($_POST['parola']) ? $parola = $_POST['parola'] : $parola = null;
if($parola != null && trim($parola) != "") {
//qui ci andrà tutto il nostro script
} else {
echo "Parametro inviato non valido";
}
Non ho fatto altro che includere il file txt carico di tutti i nostri testi, dichiarare falsa una variabile booleana, dichiarare un vettore $risultati che conterrà i possibili risultati (se ci saranno) della ricerca e infine ho trasformato tramite la funzione strtoupper i caratteri di $parola, portandoli tutti a caratteri grandi.Codice PHP:
include("testi.txt"); //includo il file di testo che ha all'interno il vettore $testi
$var[] = array(); //dichiaro una matrice (non un vettore)
$trovato = false; //dichiaro una variabile booleana
$risultati = array(); //dichiaro un vetttore
$parola = strtoupper($_POST['parola']); //trasformo in caratteri grandi tutti i carattrei di $parola
Un po di attenzione alla matrice $var che ha dimensione NxM e non è un vettore che ha dimensione 1xN.
Terza parte: cominciamo a riempire la matrice $var di tutte le parole. Come si fa ? Con un semplice explode
Riassumendo, $var è una matrice di questo genere:Codice PHP:
for($i = 0 ; $i < count($testi) ; $i++) {
$var[$i] = $testi[$i];
$var[$i] = explode(" " , $var[$i]);
}
che ad ogni colonna corrisponde una lunghezza diversa della riga.codice:ciao discutine asp: http://freephp.html.it a sul se risorse tutti, forum lo free pillola di conosci su del html.it lo php 25 eviti per agosto webmaster. ... ...
Quarta parte: verifico se la ricerca va a buon fine. Per fare ciò ho bisogno di un doppio ciclo FOR, uno per le colonne, l'altro per le righe.
tenendo conto che count($var) = numero di colonne e count($var[$i]) = numero di righe alla colonna iesima.Codice PHP:
for($i = 0 ; $i < count($var) ; $i++) {
for($j = 0 ; $j < count($var[$i]) ; $j++) {
if( $parola == strtoupper($var[$i][$j]) ) {
$trovato = true;
$articoli[] = $i;
continue;
}
}
}
Se la parola alla colonna i e alla riga j è uguale alla parola inviata dal form allora la variabile booleana cambia di valore e il vettore articoli si incrementa del numero dell'articolo (o del testo).
Quinta parte: interazione con l'utente. Si verifica il valore della variabile booleana e in base ad esso si stampa a video il voluto...
La condizione if($articoli[$i] != $articoli[$i-1]) serve per non ripetere l'articolo più volte. Mi spiego. Se la parola da ricercare è contenuta N volte nello stesso testo la ricerca darà N volte risultati solo di quel testo (cosa alquanto indesiderata, mi basta saperlo una sola volta giusto?). Per evitare questo spiacevole inconveniente basta porre quella condizione.Codice PHP:
if($trovato) {
for($i = 0; $i < count($articoli) ; $i++) {
if($articoli[$i] != $articoli[$i-1]) {
echo "La parola cercata è nell'articolo numero: $articoli[$i]";
}
}
} else {
echo "Nessun recordo trovato";
}
PRO/CONTRO di questo metodo: PRO -> semplicità del codice, velocità di esecuzione e relativamente efficente anche senza db.
CONTRO -> cose del genere ciao. | bene, | cosa? non vengono trovate in quanto ciao. != ciao , bene, != bene ecc.
OK io ho finito qui. Sperando di essere stato chiaro, di non aver sbagliato nientee di non essere stato ripetitivo con la pillola di boom , vi auguro buon proseguimento...
![]()