<?php

    
function getNGramArray( $string, $qua )
    {
        
$to = strlen( $string ) - $qua;

        for( 
$i = 0; $i <= $to; $i++ )
            
$ngrams[ ] = substr( $string, $i, $qua );

        return 
array_unique( $ngrams );
    }

    function 
compare( $a, $b )
    {
        if( 
$a[ 'lvl' ] == $b[ 'lvl' ] )
            return 
0;

        return ( 
$a[ 'lvl' ] < $b[ 'lvl' ] ) ? -1 : 1;
    }

    
mysql_connect( 'localhost', 'root', 'zaq12wsx' );
    
mysql_select_db( 'blee' );

    
$word = 'programista';
    
$ngrams = array( );
    
$length = strlen( $word );

    if( 
$length <= 6 )
        
$ngrams = array_merge( $ngrams, getNGramArray( $word, 2 ) );

    if( 
$length >= 8 )
        
$ngrams = array_merge( $ngrams, getNGramArray( $word, 4 ) );

    
$ngrams = array_merge( $ngrams, getNGramArray( $word, 3 ) );

    foreach( 
$ngrams as $gram )
        
$ngramString .= ' ngram = "'. $gram .'" OR';

    
$ngramString = substr( $ngramString, 0, -3 );

    
$query = mysql_query(  'SELECT word, COUNT( ngram ) AS d
                            FROM ngrams
                            WHERE ('
. $ngramString .' )
                            AND LENGTH( word ) BETWEEN '
. ( $length - 2 ) .' AND '. ( $length + 2 ) .'
                            GROUP BY word
                            ORDER BY d DESC' 
) or die( mysql_error() );

    while( 
$row = mysql_fetch_array( $query, MYSQL_ASSOC ) )
    {
        if ( 
$row[ 'lvl' ] = levenshtein( $word, $row[ 'word' ] ) > 3 )
            continue;

        
$words[ ] = $row;
    }

    if( 
count( $word ) )
    {
        
usort( $words, 'compare' );
        echo 
'Słowa pasujące do Twojego zapytania: ';

        foreach( 
$words as $word )
            echo 
$word[ 'word' ];
    }
    else
        echo 
'Brak wyników';

?>