2011-03-02 26 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