2012-05-03 50 views
2

由於某種奇怪的原因,當輸入2時,下面的函數返回11,我期望它返回1。哪裏不對?str_replace with array_keys/array_values返回奇怪的結果

<?php 
function convert($v){ 

    $arr = array(
    2 => 1, 
    21 => 1, 

    3 => 2, 
    6 => 2, 
    11 => 2, 
    12 => 2, 

    4 => 3, 
    14 => 3, 
    19 => 3, 

    9 => 5, 

    1 => 11, 
    10 => 11, 

    22 => 12, 
    23 => 13, 
    14 => 14, 
    ); 

    $ret = str_replace(array_keys($arr), array_values($arr), $v); 
    return $ret; 

} 

echo convert(2); // echoes 11 

?> 

回答

3

你使用了錯誤的功能,嘗試strtr來代替:

function convert($v){ 

    $arr = array(
    2 => 1, 
    21 => 1, 
    ... 
    23 => 13, 
    14 => 14, 
    ); 

    $ret = strtr($v, $arr); 
    return $ret; 

} 

在任何情況下:如果你找到一個PHP函數一些奇怪的事情,參觀手冊頁和閱讀,爲str_replace特定舉例說明你的問題:Example #2 Examples of potential str_replace() gotchas

+0

太棒了!感謝您的解決方案 – Richard

+2

不客氣,我認爲每個PHP程序員都曾犯過這個錯誤;) – hakre

2

這是因爲str_replace()處理每個替換從左到右。因此,當它與您陣列中的鍵2匹配時,它將更改爲1。之後,它擊中了鑰匙1並更改爲11。作爲一個簡單的例子:

function convert($v) { 

    $arr = array(
     1 => 2, 
     2 => 3, 
     3 => 'cat', 
    ); 

    $ret = str_replace(array_keys($arr), array_values($arr), $v); 
    return $ret; 
} 

echo convert(1); //cat is echoed 

因此,在這種情況下,1都到了2,那麼23,最後3cat

+0

+1爲解釋! – Richard