2011-03-02 25 views
6

我试着用谷歌搜索这个,但不知道寻找什么是最好的东西。我想要做的是翻译一个文本输入来输出一个按键音电话的字母。例如Hello World将输出43550 96153这个想法是我试图使用tropo语音API系统,并希望用户能够输入他们的名字作为按键音值并将其与我的数据库中的数字相匹配。字母触摸音数输出

我假设这可以用一个函数沿着

$input= $touchtone_value; 
$number_two_array (a,b,c); 
if($input==in_array($number_two_array)){ 
     $output = '2'; 
} 

我敢肯定,这将工作线来完成。但是,如果有一个班级或更简单的功能,而不是将每个字母分解为数字数组,我认为这将是一个更好的方法。在这一点上,这是一个相当开放的问题,因为我没有IDEA从哪里开始,作为实现这一目标的最佳方式。

编辑:我找到了一个解决方案,不知道它是最好的。

  $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

+1

http://www.danielkassner.com/2010/05/21/format-任何字符us-phone-number-using-php – Detect 2011-03-02 21:43:03

回答

2

这个怎么样...注意的结构:这将忽略无效的 '信',如空格,标点符号等。

现场演示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); 
    } 
?> 
+0

谢谢,这是否会比我在上面找到的解决方案更快?似乎它可能更多的工作,但我不知道'strtr'使用多少资源 – BandonRandon 2011-03-02 21:54:45

+0

这两种方法实质上完成同样的事情。在你的例子中,你正在用相应的索引创建两个数组(一个用于数字,一个用于字母)。在我的方法中,我创建了一个单个数组,其中'key'是字母,'value'是字母。诚实地说,我的方法可能会快一点,因为我正在通过索引来调用数组项,并且我不需要像'strtr()'函数那样搜索数组。 – Dutchie432 2011-03-02 21:57:36

+0

@ Dutchie432感谢您的解释。我喜欢关于你的另一件事是它摆脱了所有无效字符,这总是一个加号。 :) 谢谢! – BandonRandon 2011-03-02 22:01:04

1

我不知道我明白你问什么:

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

在情况下(1),很简单,只需使用一个数组,将字母表中的每个字母映射到相应的数字(即键是字母,数值是数字)。然后您可以遍历输入的字符,并使用数组中的相应元素输出。 (2)有点棘手。您可以从名称列表中构建一个Trie,然后使用它进行查找。

3

PHP提供了一个功能称为strtr,它做字符串翻译。第一个参数是你想要翻译的内容,第二个是原始字符,第三个是替换字符。下面是一个应该做你想做的功能。 编辑:更新我的样本来剔除那些不支持(除AZ或空间的任何其他)

<?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'); 
+0

谢谢,请参阅上面我更新了问题在发布之前包括这个例子:P – BandonRandon 2011-03-02 22:03:26

+0

@BandonRandon:是的,我发布后发现我自己。我实际上有一个使用类似于其他答案的解决方案,但是意识到'strtr'更小,更干净,更具可读性,任何性能差异都可以忽略不计。 – 2011-03-02 22:06:38

+0

什么是去除空间的最佳方式?我知道我可以从字符串的末尾删除空格和0,但是没有可以在'preg_replace'中使用的简单正则表达式吗? – BandonRandon 2011-03-03 20:39:47