【问题标题】:letters to touch tone number output按键音数字输出的字母
【发布时间】:2011-07-07 14:52:19
【问题描述】:

我尝试在 Google 上搜索此内容,但不确定要查找的最佳内容是什么。我要做的是翻译文本输入以输出按键式电话的字母。例如Hello World 将输出43550 96153想法是我正在尝试使用 tropo 语音 api 系统并希望用户能够输入他们的姓名作为按键音值并将其与他们的姓名匹配为我的数据库中的数字.

我假设这可以通过类似于

的函数来完成
$input= $touchtone_value;  
$number_two_array (a,b,c);  
if( $input==in_array($number_two_array)){ 
        $output = '2';
}

我相信这会奏效。但是,如果有一个类或一个比将每个字母分解为数字数组更简单的函数,我认为这将是一种更好的方法。在这一点上,这是一个相当开放的问题,因为我不知道从哪里开始作为完成此任务的最佳方式。

编辑:我找到了一个解决方案,但不确定它是否是最好的。

            $input = strtolower('HELLO WORLD');
            echo  'input: '. $input. "\n";
            echo $output = 'output: '.  strtr($input,'abcdefghijklmnopqrstuvwxyz', '22233344455566677778889999'); 

input:hello world 
output: 43556 96753

现在我只需要找到一种方法来删除空格:) http://codepad.org/Ieug0Zuw

来源:code a number into letters

【问题讨论】:

标签: php class function tropo


【解决方案1】:

这样的结构怎么样...注意:这将忽略无效的“字母”,如空格、标点符号等。

现场演示 http://codepad.org/pQHGhm7Y

<?php
    echo getNumbersFromText('Hello There').'<br />';
    echo getNumbersFromText('This is a really long text string').'<br />';

    function getNumbersFromText($inp){
        $result=array();
        $inp = strtolower($inp);
        $keypad = array('a' => '2', 'b' => '2', 'c' => '2', 'd' => '3',
            'e' => '3', 'f' => '3', 'g' => '4', 'h' => '4',
            'i' => '4', 'j' => '5', 'k' => '5', 'l' => '5',
            'm' => '6', 'n' => '6', 'o' => '6', 'p' => '7',
            'q' => '7', 'r' => '7', 's' => '7', 't' => '8',
            'u' => '8', 'v' => '8', 'w' => '9', 'x' => '9',
            'y' => '9', 'z' => '9');

        for ($x=0; $x<strlen($inp); $x++){
            $letter = $inp[$x];
            if ($keypad[$letter]) $result[]= $keypad[$letter];
        }
        return implode('',$result);
    }
?>

【讨论】:

  • 谢谢,这会比我上面找到的解决方案更快吗?似乎它可能需要更多的工作,但我不知道strtr 使用了多少资源
  • 这两种方法基本上完成了同样的事情。在您的示例中,您正在创建两个具有相应索引的数组(一个用于数字,一个用于字母)。在我的方法中,我创建了一个数组,其中key 是字母,value 是字母。老实说,我的方法可能会快一点,因为我是按索引调用数组项,而且我不需要像 strtr() 函数那样搜索数组。
  • @Dutchie432 感谢您的解释。我喜欢你的另一件事是它摆脱了所有无效字符,这总是一个加号。 :) 谢谢!
  • @Dutchie432:我做了一个简单的基准测试(这很可能是错误的),针对 4 个字符串测试您的解决方案和 strtr 方法,每个字符串 10,000 次,看起来您的解决方案大约是比strtr 方法慢一个数量级。见:codepad.org/uogSa8TO
  • 关于基准的注意事项:这些函数非常简单,两种实现都足够好。 strtr 的好处是它更易于阅读和理解。
【解决方案2】:

PHP 提供了一个名为strtr 的函数,它可以进行字符串转换。第一个参数是你要翻译的内容,第二个是原始字符,第三个是替换字符。下面是一个应该做你想做的功能。 编辑:更新了我的示例,去除了所有不受支持的字符(除了 a-z 或空格之外的任何字符)

<?php

function get_tones($inp) {
    $from = 'abcdefghijklmnopqrstuvwxyz ';
    $to = '222333444555666777788899990';

    // convert the input to lower case
    $inp = strtolower($inp);

    // remove anything that isn't a letter or a space
    $inp = preg_replace('/[^a-z ]/', '', $inp);

    return strtr($inp, $from, $to);
}

assert(get_tones('Hello world') == '43556096753');
assert(get_tones('Hell234"*&o world') == '43556096753');
assert(get_tones('ALEX') == '2539');
assert(get_tones('    ') == '0000');

【讨论】:

  • 谢谢,见上文我更新了问题以包含此示例,然后再发布此示例:P
  • @BandonRandon:是的,我在发布它之后就注意到了。实际上,我有一个像其他答案一样使用数组的解决方案,但我意识到 strtr 更小、更干净、更具可读性,并且任何性能差异都可以忽略不计。
  • 去除空格的最佳方法是什么?我知道我可以删除字符串末尾的空格和 0,但是没有一个简单的正则表达式可以在 preg_replace 中使用吗?
  • 抱歉,如果我使用[^a-z],现在没有看到/[^a-z ]/ 末尾的空格,问题解决了:)
【解决方案3】:

我不确定我是否完全理解您的要求:

  1. 你输入的是单词,你想输出对应的数字吗?
  2. 你输入的是数字,你想输出对应的单词吗?

在情况(1)中,很简单,只需使用一个数组,将字母表中的每个字母映射到相应的数字(即键是字母,值是数字)。然后,您可以迭代输入的字符,并使用数组中的相应元素进行输出。

案例 (2) 有点棘手。您可以从您的姓名列表中构建一个Trie,并使用它进行查找。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 2017-02-26
    相关资源
    最近更新 更多