Ver Mensaje Individual
  #6 (permalink)  
Antiguo 23/07/2014, 23:10
Avatar de Alexis88
Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Reemplazar sin mayor problema

Había olvidado el detalle de que puedes elegir el número de palabra.

Código PHP:
Ver original
  1. <?php
  2. function reemplazar($cadena, $delimitador, $objetivo, $reemplazo, $numero){
  3.     $array = explode($delimitador, $cadena);
  4.     $total = 0;
  5.     for ($i = 0, $l = count($array); $i < $l; $i++)
  6.         if ($array[$i] == $objetivo){
  7.             if (++$total == $numero){
  8.                 $array[$i] = $reemplazo;
  9.                 break;
  10.             }
  11.         }
  12.     return implode($delimitador, $array);
  13. }
  14.  
  15. $string = 'Andrés;Carlos;Luis;Carlos;Julián;Carlos;Mario';
  16. $delimiter = ';';
  17. $target = 'Carlos';
  18. $replace = 'Germán';
  19. $number = 3;
  20.  
  21. echo reemplazar($string, $delimiter, $target, $replace, $number);

Lo anterior imprimirá 'Andrés;Carlos;Luis;Carlos;Julián;Germán;Mario'. La función recibe la cadena completa, el delimitador entre cada palabra que compone a la cadena, la palabra a reemplazar, la palabra que será utilizada como reemplazo y el número de palabra a reemplazar, en caso haya más de una (porque supongo que así es como deseas hacerlo). En la función, separo a la cadena en las palabras que la componen a partir del delimitador, luego, inicializo a la variable acumuladora $total en cero e inicio el bucle for con el cual recorro el array generado previamente. En cada iteración, verifico si la palabra en la iteración actual es igual a la palabra que busco reemplazar, de ser así, incremento en un el valor de $total pues se ha encontrado una coincidencia y comparo su valor actualizado con el número de coincidencia a reemplazar; si son iguales, procedo a asignar a la palabra de reemplazo en lugar de la palabra buscada y termino la ejecución del bucle. Finalmente, reconstruyo la cadena (ya actualizada) y la devuelvo.

Se me ocurren varias ideas para implementar, como verificar que el número de coincidencia a reemplazar no sea mayor que la cantidad real de repeticiones de la palabra a reemplaza y mucho menos mayor que la cantidad total de palabras que componen a la cadena, pero esa tarea la dejo en tus manos.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 25/07/2014 a las 01:17 Razón: Explicación