Ci sono alternative che restituiscono lo stesso risultato ma che magari sono piu' semplici o veloci ???
Solo una curiosita' , io ho provato questa e come risultato non e' male ...
codice:
<?php // 4
// supponiamo di avere un database di nome database con una tabella table
// che contiene id e name , dove name e' il nome di qualcuno o di qualcosa ...
// CONNESSIONE AL DATABASE
$db = mysql_connect( 'localhost', 'root', '' );
mysql_select_db( 'database' );
// IMPOSTAZIONI RICERCA
// CHIAVE DA CERCARE
$search = "test";
// PRECISIONE NELLA RICERCA ( 1 bassissima, 10 abbastanza elevata elevata )
// [ comunque da len $search in su il risultato e' identico ... ]
$searchPrecision = 1;
// LIMITE RISCONTRI DA MOSTRARE
$limitmatches = 10;
// INIZIO PROGRAMMA
// VARIABILE CONTENENTE PARTE DELLA QUERY
$search4query = "";
// IN BASE ALLA PRECISIONE SCELTA ...
for( $a = 0, $b = strlen( $search ); $a < $b; $a += $searchPrecision ) {
// DIVIDO LA CHIAVE DI RICERCA E FACCIO L' ESCAPE
$tempstr = mysql_escape_string( substr( $search, $a, $searchPrecision ) );
// ACCODO ALLA VARIABILE nometabella LIKE '%valore%' OR
$search4query .= "name LIKE '%{$tempstr}%' OR ";
}
// ELIMINO ULTIMO ' OR' DALLA QUERY E LA CREO PER ESTESO
$search4query = "SELECT id, name FROM table WHERE ".substr( $search4query, 0, -3 );
// ESEGUO LA QUERY
$dbQuery = mysql_unbuffered_query( $search4query );
// VARIABILE CONTENENTE I RISULTATI
$matchresult = Array();
// CICLO LA QUERY APPENA FATTA
while( $dbQuery && $result = mysql_fetch_row( $dbQuery ) ) {
// CALCOLO IL levenshtein TRA MATCH E CHIAVE DI RICERCA
$lev = levenshtein( $result[1], $search );
// SE E' ALMENO COMPRESO TRA 0 E 255 ...
if( $lev >= 0 ) {
// CONTROLLO CHE LA CHIAVE NON SIA IDENTICA O DENTRO IL RISULTATO ...
if( $lev > 0 && strpos( $result[1], $search ) !== false ) {
// PERCHE' SE COSI' E' , IMPOSTO NON A ZERO MA ALMENO A
// UNO QUESTA RIGA COSI' DA PILOTARE I RISCONTRI
// DEL levenshtein PONENDO ALMENO AD 1 TUTTI I
// RISULTATI CONTENENTI TALE CHIAVE
$lev = 1;
}
// SETTO L' ARRAY QUALORA NON FOSSE ESISTENTE
if( isSet( $matchresult[$lev] ) == false ) {
$matchresult[$lev] = Array();
}
// AGGIUNGO VALORI IN POSIZIONE ARRAY[$lev]
// COSI' DA POTERLI ORDINARE POI ...
array_push(
$matchresult[$lev],
Array(
'id'=>$result[0],
'value'=>$result[1],
'match'=>$lev
)
);
}
}
// SE HO OTTENUTO ALMENO UN RISULTATO
if( count( $matchresult ) > 0 ) {
// RIORDINO PER CHIAVI L' ARRAY E LO RESETTO
ksort( $matchresult );
reset( $matchresult );
// VARIABILE DI OUTPUT
$output = "";
// VARIABILE DI CONTROLLO RISULTATI
$templimit = 0;
// PER OGNI CHIAVE DELL' ARRAY ORDINATO IN ORDINE CRESCENTE ...
foreach( $matchresult as $value ) {
// LEGGO TUTTI GLI ARRAY INTERNI ...
for( $a = 0, $b = count( $value ); $a < $b; $a++ ) {
// SE SONO OLTRE IL LIMITE MASSIMO DI RISULTATI
if( $templimit >= $limitmatches ) {
// BLOCCO QUESTO FOR
$a = $b;
// break ? .... volendo si
}
// ALTRIMENTI AGGIUNGO AD OUTPUT I DATI INTERESSATI
else {
$output .= "
Match: {$value[$a]['match']}
Id: {$value[$a]['id']}
Testo: {$value[$a]['value']}<hr />
";
// INCREMENTO LA VARIABILE DI CONTRLLO MAX RISULTATI
$templimit++;
}
}
}
// STAMPO L' OUTPUT
echo $output;
}
// CHIUDO IL DATABASE
mysql_close( $db );
?>