str_replace con array_keys/array_values ​​devuelve un resultado extraño

Por alguna extraña razón, la siguiente función devuelve 11 cuando la entrada 2, donde esperaría que regresara 1. ¿Qué está mal?

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

?>

preguntado el 03 de mayo de 12 a las 19:05

2 Respuestas

Estás usando la función incorrecta, prueba strtr en lugar:

function convert($v){

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

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

}

Y en cualquier caso: si encuentra algo extraño con una función de PHP, visite su página de manual y léala, por str_replace se da un ejemplo específico que explica su problema: Ejemplo #2 Ejemplos de posibles errores de str_replace()

contestado el 03 de mayo de 12 a las 19:05

¡Estupendo! Gracias por la solución - Richard

De nada, creo que todos los programadores de PHP cometieron este error una vez;) - hakré

Esto es porque str_replace() procesa cada reemplazo de izquierda a derecha. Así que cuando coincide con la clave 2 en su matriz, se cambia a un 1. Después de eso, presiona la tecla. 1 y se cambia a un 11. Como un breve ejemplo:

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

Entonces en este caso el 1 va a un 2, entonces eso 2 a una 3y finalmente el 3 a cat.

contestado el 03 de mayo de 12 a las 19:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.