Реализация словаря 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);
}

?>
Другие вопросы по тегам