Не могу сказать, действительно ли он быстрее, но это моя версия.
$input = 'al';
$matches = array_filter($streetNames, create_function('$v','return (stripos($v,'.$input.') !== false ? true : false);'));
$weight = array_map(create_function('$v','return array($v,levenshtein('.$input.',$v));'),$matches);
uasort($weight, create_function('$a,$b', 'if ($a[1] == $b[1]) {return 0;} return ($a[1] < $b[1]) ? -1 : 1;'));
$weight = array_slice($weight, 0, 10);
Это создает взвешенный список совпадений. Они сортируются по расстоянию между входной строкой и названием улицы. 0 представляет истинное совпадение.
Результирующий массив выглядит так
array (
0 =>
array (
0 => 'Alola St',
1 => 7,
),
1 =>
array (
0 => 'Allen Rd',
1 => 7,
)
)
Где 0 => название улицы и 1 => расстояние Левенштейна