带有array_keys / array_values的str_replace返回奇怪的结果

时间:2012-05-03 18:37:10

标签: php str-replace

由于某些奇怪的原因,当输入11时,下面的函数返回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

?>

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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,然后2转到3,最后3转到cat }。