我希望在 PHP 中简化 T9 移动输入法的实现,即使用 Trie 或任何其他简单且最佳的解决方案。
任何帮助将不胜感激。
它可能效率不高,并且可能有一些更好的解决方案来解决您的问题,并且它也有一些限制,例如,如果您输入的数字超过 15 位,它可能无法正常工作。但我只是试图在不使用 Tries 的情况下分享我的想法,它可能会给你一些想法。试着分享你的经验。
<?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);
}
?>