Реализация словаря PHP T9 с использованием Trie
Мне нужна упрощенная реализация метода ввода T9 для мобильных устройств в PHP, то есть с использованием Trie или любого другого простого и наилучшего решения.
Любая помощь будет высоко оценена.
1 ответ
Решение
Это может быть не так эффективно, и может быть какое-то лучшее решение для вашей проблемы, и оно также имеет некоторые ограничения, например, если вы введете число более 15 цифр, оно может работать некорректно. Но я просто попытался поделиться своими мыслями без попыток, это может дать вам некоторое представление. Просто попробуйте поделиться своим опытом.
<?php
$T9Array = array(
2 => array('a', 'b', 'c'),
3 => array('d', 'e', 'f'),
4 => array('g', 'h', 'i'),
5 => array('j', 'k', 'l'),
6 => array('m', 'n', 'o'),
7 => array('p', 'q', 'r', 's'),
8 => array('t', 'u', 'v'),
9 => array('w', 'x', 'y', 'z')
);
function search_combination($input)
{
global $T9Array;
if (! is_numeric($input))
return false;
$arr = str_split($input);
$total = 1;
for($a = count($arr) - 1; $a >= 0; $a--)
{
$total *= count($T9Array[$arr[$a]]);
$t[$a] = $total;
}
sort($t);
for ($b = 0; $b < count($arr); $b++)
{
$k = $l = 0;
$j = count($arr) - ($b + 2);
for ($c = 0; $c < $total; $c++)
{
$ret[$c] .= $T9Array[$arr[$b]][$l];
if ($j >= 0 && $c == ($t[$j] * ($k+1)) - 1 || $j < 0)
{
$k++;
if ($l < count($T9Array[$arr[$b]]) - 1)
$l++;
else
$l = 0;
}
}
}
return $ret;
}
function search_combination_str($string)
{
global $T9Array;
if (empty($string))
return false;
$arr = str_split(strtolower($string));
foreach ($arr as $a)
{
foreach ($T9Array as $key => $val)
{
$tmp = array_keys($val, $a);
if ($tmp)
$conv .= $key;
}
}
return search_combination($conv);
}
?>