2011-08-27 13 views
11

ho su array PHP, per esempio:Come ordinare una matrice per similarità in relazione a una parola immessa.

$arr = array("hello", "try", "hel", "hey hello"); 

Ora voglio fare riorganizzare dell'array che sarà basata sui più stretti quasi parole tra la matrice e la mia ricerca $ var.

Come posso farlo?

+0

si vuol dire organizzare l'array in un ordine specifico sulla base di un valore di ingresso immesso dall'utente? – Drewdin

+0

Dai un'occhiata a [soundex] (http://php.net/manual/de/function.soundex.php) e [metaphone] (http://php.net/metaphone). Sono due modi comuni in PHP per calcolare la differenza tra due parole. Ma al momento non ho idea di come ordinarli secondo una metrica significativa. Potresti spiegare un po 'di più il tuo ordinamento? –

risposta

4

È possibile utilizzare la funzione levenshtein

<?php 
// input misspelled word 
$input = 'helllo'; 

// array of words to check against 
$words = array('hello' 'try', 'hel', 'hey hello'); 

// no shortest distance found, yet 
$shortest = -1; 

// loop through words to find the closest 
foreach ($words as $word) { 

    // calculate the distance between the input word, 
    // and the current word 
    $lev = levenshtein($input, $word); 

    // check for an exact match 
    if ($lev == 0) { 

     // closest word is this one (exact match) 
     $closest = $word; 
     $shortest = 0; 

     // break out of the loop; we've found an exact match 
     break; 
    } 

    // if this distance is less than the next found shortest 
    // distance, OR if a next shortest word has not yet been found 
    if ($lev <= $shortest || $shortest < 0) { 
     // set the closest match, and shortest distance 
     $closest = $word; 
     $shortest = $lev; 
    } 
} 

echo "Input word: $input\n"; 
if ($shortest == 0) { 
    echo "Exact match found: $closest\n"; 
} else { 
    echo "Did you mean: $closest?\n"; 
} 

?> 
2

se si desidera ordinare l'array, si può fare questo:

$arr = array("hello", "try", "hel", "hey hello"); 
$search = "hey"; //your search var 

for($i=0; $i<count($arr); $i++) { 
    $temp_arr[$i] = levenshtein($search, $arr[$i]); 
} 
asort($temp_arr); 
foreach($temp_arr as $k => $v) { 
    $sorted_arr[] = $arr[$k]; 
} 

$sorted_arr dovrebbe poi essere in ordine decrescente a partire dalla parola più vicina al termine di ricerca.

10

Questa potrebbe essere una soluzione rapida utilizzando http://php.net/manual/en/function.similar-text.php:

Questo calcola la similitudine tra due stringhe come descritto nel Classics Programmazione: Implementazione migliori algoritmi del mondo da Oliver (ISBN 0-131-00413-1) . Si noti che questa implementazione non utilizza una pila come nel pseudo codice di Oliver, ma chiamate ricorsive che possono o meno velocizzare l'intero processo. Si noti inoltre che la complessità di questo algoritmo è O (N ** 3) dove N è la lunghezza della stringa più lunga.

$userInput = 'Bradley123'; 

$list = array('Bob', 'Brad', 'Britney'); 

usort($list, function ($a, $b) use ($userInput) { 
    similar_text($userInput, $a, $percentA); 
    similar_text($userInput, $b, $percentB); 

    return $percentA === $percentB ? 0 : ($percentA > $percentB ? -1 : 1); 
}); 

var_dump($list); //output: array("Brad", "Britney", "Bob"); 

O utilizzando http://php.net/manual/en/function.levenshtein.php:

La distanza Levenshtein è definito come il numero minimo di caratteri si deve sostituire, inserire o cancellare per trasformare str1 in str2. La complessità dell'algoritmo è O (m * n), dove n e m sono la lunghezza di str1 e str2 (piuttosto buona se confrontata con similar_text(), che è O (max (n, m) ** 3), ma ancora costoso).

$userInput = 'Bradley123'; 

$list = array('Bob', 'Brad', 'Britney'); 

usort($list, function ($a, $b) use ($userInput) { 
    $levA = levenshtein($userInput, $a); 
    $levB = levenshtein($userInput, $b); 

    return $levA === $levB ? 0 : ($levA > $levB ? 1 : -1); 
}); 

var_dump($list); //output: array("Britney", "Brad", "Bob"); 
+0

questo ha bisogno di più upvotes .. grazie amico! anche gli esempi di php.net levenstein sono sorprendentemente chiari! –

+0

Come potrebbe il testo simile essere applicato a un array multidimensionale? – MikeeeGeee

Problemi correlati