2013-05-29 4 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)' до цикла, по соображениям производительности ... но eh.) – cHao

+0

Спасибо, совет и ответ обновлены –

+0

Какой способ лучше для вашей работы: '$ start = ord ('a'); function string_to_digits ($ string) { global $ start; .... ' – Anton

3

Почему не использовать карту и получить код каждого символа, используя разницу с «а»

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; 
} 
Смежные вопросы