Bonjour à tous,
Aujourd'hui, j'ai eu besoin d'un algo pour trouver le mot le plus proche dans une liste. Vu que ça existait pas et que je n'arrivais pas à le faire simplement avec array_map ou array_walk, j'ai codé une fonction que voici:
La fonction retourne false si aucune correspondance n'a été trouvée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 function array_find_closest ($needle, $haystack, $approx = 3) { if (($offset = array_search($needle, $haystack)) !== false) return $haystack[$offset]; foreach ($haystack as $item) { $lev = levenshtein($needle, $item); // if needle is completely different if ($lev >= strlen($item)) continue; // if word is 'too' different if ($lev > $approx) continue; $guess[$item] = $lev; } if (empty($guess)) return false; asort($guess); return key($guess); };
Note: le troisième paramètre vous permet de déterminer la 'distance' maximum acceptable. Il représente le nombre maximum de caractère différents, à ajouter ou à soustraire pour trouver une correspondance.
Attention: cette fonction utilise l'algorithme de levenshtein pour déterminer les correspondances possibles, cet algo est assez lourd et rends la fonction assez gourmande.
Usage:
Voilà, si quelqu'un à des idées pour réduire la complexité ou améliorer en quoi que ce soit, les remarques sont les bienvenues.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 $colors = array('orange', 'blue', 'yellow', 'pink', 'black', 'white'); var_dump( array_find_closest('blu', $colors) ); // 'blue' var_dump( array_find_closest('P1nk', $colors) ); // 'pink' var_dump( array_find_closest('color is black', $colors) ); // false (trop de différences) var_dump( array_find_closest('Bl4cK', $colors) ); // 'black' var_dump( array_find_closest('Bl4cK', $colors, 2) ); // false (il faut changer 3 caractère pour arriver à 'black' mais 2 seulement sont autorisés)
Partager