2013-05-29 247 views
0

我写了一个函数,它将一个单词翻译成一个数字的数组。 F.e.如何优化此php代码?

$alphas = range('a', 'z'); 
function dig_to_string($string) { 
    global $alphas; 
    $array = str_split($string); 
    foreach($array as $a) { 
     $digits[] = array_search($a,$alphas); 
    } 
    return $digits; 
} 
$word = 'color'; 
$array = dig_to_string($word); 
// Array ([0] => 2 [1] => 14 [2] => 11 [3] => 14 [4] => 17) 
// Because 'c' is the second alphabet's letter, 'o' is 14th and so on. 
// Means 'a' has 0-index 

有没有办法优化它?

+1

我会开始修改名称:'str_to_dig' – deceze

+0

同意。但如何优化性能? – Anton

回答

2

您可以简单地使用ord()

function string_to_digits($string) { 
    $start=ord('a'); 
    $length=strlen($string); 
    for($i=0;$i<$length;$i++) 
    { 
     $digits[]=ord($string[$i])-$start; 
       // $digits[]=ord($string[$i]); //If you want ASCII code to be returned 

    } 
    return $digits; 
} 
+0

我可能会说'$ a = ord('a');'在循环之前并使用它来代替'97',这样就能更清楚地知道循环应该做什么。 (可能还想在循环之前找到'strlen($ string)',出于性能方面的原因......但是呃。) – cHao

+0

谢谢,建议采取和答案更新 –

+0

哪种方式更好地执行你或这个: '$ start = ord('a'); 函数string_to_digits($ string){ global $ start; ....' – Anton

3

为什么不使用的地图,并使用与“A”

function code($n){return ord($n)-ord('a')+1;} 
$b = array_map("code", str_split("hello")); 
+2

+1好的思想。虽然'ord('a')+ 1'确实是一个常量...... :) – deceze

+0

你应该考虑大写字母以及非字母字符。 – Gumbo

+0

当然,这将是理想的,但我的代码在语义上等同于期望并回答问题,不是吗? – lc2817

0
function str_to_dig($string) { 
    static $map = null; 
    if ($map === null) { 
     $map = array_flip(range('a', 'z')); 
    } 

    return array_map(function ($char) use ($map) { return $map[$char]; }, str_split($string)); 
} 
  • 初始化字符数组的差异获取每个字符的代码只有一次,而无需使用global
  • 使地图可以直接访问,而不是通过数组搜索多次
  • array_map,be导致weeeee!^_^
1

也许这是一个好一点。我没有测试它,但我认为它应该工作;-)

function dig_to_string($string) 
{ 
    $len = strlen($string); 
    $digits = array(); 
    for($i=0;$i<$len;$i++){ 
     $digits[$i] = ord($string[$i])-97; //97 = ASCII for 'a' 
    } 
    return $digits; 
}