2

奇妙な理由で、以下の関数は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

?>
4

2 に答える 2

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は、に移動し2、次に、2に移動し3、最後にに3移動しcatます。

于 2012-05-03T18:47:06.097 に答える
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 に答える