2

出于某种奇怪的原因,下面的函数11在 input 时返回2,我希望它返回1。怎么了?

<?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

?>
4

2 回答 2

3

您使用了错误的功能,请尝试strtr

function convert($v){

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

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

}

无论如何:如果您发现 PHP 函数有什么奇怪的地方,请访问它的手册页并阅读它,因为str_replace给出了一个解释您的问题的具体示例:示例 #2 潜在 str_replace() 陷阱的示例

于 2012-05-03T18:48:35.663 回答
3

这是因为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去 a 2,然后2去 a 3,最后去3cat

于 2012-05-03T18:47:06.097 回答