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 ); ?>


Rispondi quotando

[/berlusca_mode]