Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] PHP OO Problema al sustituir subcadena/tag por otra cadena

Estas en el tema de Problema al sustituir subcadena/tag por otra cadena en el foro de PHP en Foros del Web. La idea es que la siguiente función genere sobre el usuario: un amigo aleatorio, 5 preguntas aleatorias sobre este amigo, que seleccione todas las tags ...
  #1 (permalink)  
Antiguo 01/10/2013, 05:47
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Problema al sustituir subcadena/tag por otra cadena

La idea es que la siguiente función genere sobre el usuario:
un amigo aleatorio, 5 preguntas aleatorias sobre este amigo, que seleccione todas las tags de la BD y sustituya en las preguntas aleatorias escogidas las tags por los datos de dicho amigo para personalizar las preguntas.

Todo lo hace bien, excepto la sustitución de las tags por los datos del amigo.

Excepto las tags, y los números aleatorios, los datos están en sesión.

El código es el siguiente, he leído el manual sobre las funciones in_array() y str_ireplace(); y no entiendo por qué no funciona.

Código PHP:
Ver original
  1. function play_start()
  2. {
  3.     if ( isset( $_SESSION['user_twitter'] ) AND $_SESSION['twitter_status'] == true )
  4.     {
  5.         //obtengo los amigos en una sesion
  6.         gettruefriendslist();
  7.        
  8.         //instancio la clase personal
  9.         $newget                     = new Twitter_main();
  10.        
  11.         //obtengo un numero de amigo aleatorio
  12.         $getfriendrandom            = $newget->getrandomvalue( $_SESSION['gettruefriendslist'] );
  13.        
  14.         //guardo el amigo aleatorio en sesion
  15.         $_SESSION['randomresult']['friend'] = $_SESSION['gettruefriendslist'][$getfriendrandom];
  16.        
  17.         //instancio la clase Conectar
  18.         $newget2                    = new Conectar();
  19.        
  20.         //selecciono las preguntas y las guardo en array
  21.         $select                     = "SELECT * FROM questions";
  22.        
  23.         $result_conexion            = $newget2->conectar( $select );
  24.  
  25.         while ($result = mysqli_fetch_array( $result_conexion ))
  26.         {
  27.             $getquestions[] = $result;
  28.         }
  29.        
  30.         $_SESSION['randomresult']['questions'] = array();
  31.        
  32.         //obtengo de la BD todos los tags y los meto en array
  33.         $select = "SELECT * FROM tags";
  34.         $get    = $newget2->conectar( $select );
  35.         while ( $result_conexion = mysqli_fetch_array( $get ) )
  36.         {
  37.             $tags[] = $result_conexion['tag'];
  38.         }
  39.        
  40.         //busco 5 preguntas aleatorias
  41.         //y sustituyo [nombre] por el valor que deseo finalmente
  42.         for($i=0; $i<=4 ; $i++)
  43.            
  44.         {
  45.             //obtengo 5 numeros aleatorios
  46.             $getquestionrandom      = $newget->getrandomvalue ( $getquestions );
  47.            
  48.             //guardo las preguntas segun los numeros anteriores
  49.             array_push($_SESSION['randomresult']['questions'], $getquestions[$getquestionrandom]);
  50.            
  51.             //busco en las preguntas los tags
  52.             if ( in_array( $tags, $_SESSION['randomresult']['questions'][$i] ) )
  53.             {
  54.                 //reemplazo los tags por el valor y finalmente lo guardo
  55.                 $_SESSION['randomresult']['questions'][$i]['question'] =
  56.                 str_ireplace ( $tags, "@".$_SESSION['randomresult']['friend']['screen_name'],
  57.                   $_SESSION['randomresult']['questions'][$i]['question'] );
  58.             }
  59.         }
  60.     }
  61.        
  62. }

¿Alguien puede ayudarme a entender por qué no funciona?
__________________
Ayúdame a hacerlo por mi mismo.
  #2 (permalink)  
Antiguo 01/10/2013, 06:09
Avatar de xSkArx  
Fecha de Ingreso: marzo-2008
Ubicación: Chile
Mensajes: 945
Antigüedad: 16 años, 1 mes
Puntos: 96
Respuesta: Problema al sustituir subcadena/tag por otra cadena

Para que tienes el @ en el str_ireplace()?
__________________
Busca, lee y practica todo lo que puedas.
Usa siempre el buscador antes de postear.
Si posteas código, utiliza el HIGHLIGHT correcto.
  #3 (permalink)  
Antiguo 01/10/2013, 06:18
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Problema al sustituir subcadena/tag por otra cadena

Cita:
Iniciado por SkAr88 Ver Mensaje
Para que tienes el @ en el str_ireplace()?
Porque al estar trabajando con la API de Twitter, el screen_name no incluye el @, así que se lo incorporo. Sino el reemplazo que hago en el controller donde está esa función la tendría que hacer en la vista, y eso sería añadir código PHP al PHP que ya tengo allí para recorrer los arrays de sesión y demás para presentar los datos al usuario.
__________________
Ayúdame a hacerlo por mi mismo.
  #4 (permalink)  
Antiguo 01/10/2013, 06:23
Avatar de xSkArx  
Fecha de Ingreso: marzo-2008
Ubicación: Chile
Mensajes: 945
Antigüedad: 16 años, 1 mes
Puntos: 96
Respuesta: Problema al sustituir subcadena/tag por otra cadena

Haz hecho var_dump de la ultima variable de session?
__________________
Busca, lee y practica todo lo que puedas.
Usa siempre el buscador antes de postear.
Si posteas código, utiliza el HIGHLIGHT correcto.
  #5 (permalink)  
Antiguo 01/10/2013, 06:29
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Problema al sustituir subcadena/tag por otra cadena

Cita:
Iniciado por SkAr88 Ver Mensaje
Haz hecho var_dump de la ultima variable de session?
Sí y no sustituye las tags.

El var_dump( $_SESSION['randomresult']['questions'] );

Devuelve lo siguiente

Código PHP:
Ver original
  1. array(5) {
  2.   [0]=>
  3.   array(6) {
  4.     [0]=>
  5.     string(2) "13"
  6.     ["id_question"]=>
  7.     string(2) "13"
  8.     [1]=>
  9.     string(46) "¿[nombre] 111?"
  10.     ["question"]=>
  11.     string(46) "¿[nombre] 111?"
  12.     [2]=>
  13.     string(2) "18"
  14.     ["id_typequestions"]=>
  15.     string(2) "18"
  16.   }
  17.   [1]=>
  18.   array(6) {
  19.     [0]=>
  20.     string(2) "21"
  21.     ["id_question"]=>
  22.     string(2) "21"
  23.     [1]=>
  24.     string(18) "[nombre]55"
  25.     ["question"]=>
  26.     string(18) "[nombre]55"
  27.     [2]=>
  28.     string(2) "18"
  29.     ["id_typequestions"]=>
  30.     string(2) "18"
  31.   }
  32.   [2]=>
  33.   array(6) {
  34.     [0]=>
  35.     string(2) "13"
  36.     ["id_question"]=>
  37.     string(2) "13"
  38.     [1]=>
  39.     string(46) "¿[nombre] 1234?"
  40.     ["question"]=>
  41.     string(46) "¿[nombre] 1234?"
  42.     [2]=>
  43.     string(2) "18"
  44.     ["id_typequestions"]=>
  45.     string(2) "18"
  46.   }
  47.   [3]=>
  48.   array(6) {
  49.     [0]=>
  50.     string(2) "16"
  51.     ["id_question"]=>
  52.     string(2) "16"
  53.     [1]=>
  54.     string(63) "¿11[nombre] 22?"
  55.     ["question"]=>
  56.     string(63) "¿11 [nombre] 22?"
  57.     [2]=>
  58.     string(2) "20"
  59.     ["id_typequestions"]=>
  60.     string(2) "20"
  61.   }
  62.   [4]=>
  63.   array(6) {
  64.     [0]=>
  65.     string(2) "19"
  66.     ["id_question"]=>
  67.     string(2) "19"
  68.     [1]=>
  69.     string(16) "3333333333333333"
  70.     ["question"]=>
  71.     string(16) "3333333333333333"
  72.     [2]=>
  73.     string(2) "19"
  74.     ["id_typequestions"]=>
  75.     string(2) "19"
  76.   }
  77. }

Donde dice [nombre] tendría que haber sustituido por el @screen_name, pero ni caso :S
__________________
Ayúdame a hacerlo por mi mismo.
  #6 (permalink)  
Antiguo 01/10/2013, 06:58
Avatar de xSkArx  
Fecha de Ingreso: marzo-2008
Ubicación: Chile
Mensajes: 945
Antigüedad: 16 años, 1 mes
Puntos: 96
Respuesta: Problema al sustituir subcadena/tag por otra cadena

Nose si tenga algo que ver pero estas haciendo esto,
Código PHP:
Ver original
  1. $var= str_ireplace($tag,$otravar,$var)//pienso que deberias guardarlo en otra variable algo asi
  2.  
  3. $var2=str_ireplace($tag,$otravar,$var)
__________________
Busca, lee y practica todo lo que puedas.
Usa siempre el buscador antes de postear.
Si posteas código, utiliza el HIGHLIGHT correcto.
  #7 (permalink)  
Antiguo 01/10/2013, 09:26
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Problema al sustituir subcadena/tag por otra cadena

Cita:
Iniciado por SkAr88 Ver Mensaje
Nose si tenga algo que ver pero estas haciendo esto,
Código PHP:
Ver original
  1. $var= str_ireplace($tag,$otravar,$var)//pienso que deberias guardarlo en otra variable algo asi
  2.  
  3. $var2=str_ireplace($tag,$otravar,$var)
no se si lo dices para que pruebe a ver si funciona correctamente el str_ireplace, pero si no es así, ese metodo se supone que sería en caso de que tuviera pocos tags y reemplazos que hacer. tu alternativa es limitada puesto que tendría que saber siempre el número de tags que hay en la frase. no creo que eso sea útil para lo que quiero conseguir.

muchas gracias!! :D
__________________
Ayúdame a hacerlo por mi mismo.
  #8 (permalink)  
Antiguo 01/10/2013, 09:47
Avatar de xSkArx  
Fecha de Ingreso: marzo-2008
Ubicación: Chile
Mensajes: 945
Antigüedad: 16 años, 1 mes
Puntos: 96
Respuesta: Problema al sustituir subcadena/tag por otra cadena

Se supone que estas buscando y reemplazando tags en una variable, guardando el resultado en esa misma variable, a lo que yo entiendo segun el manual de php.net es que el resultado se sebe guardar en otra variable y no en la misma que estas buscando. Por lo menos asi lo.entiendo yo
__________________
Busca, lee y practica todo lo que puedas.
Usa siempre el buscador antes de postear.
Si posteas código, utiliza el HIGHLIGHT correcto.
  #9 (permalink)  
Antiguo 01/10/2013, 14:11
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Problema al sustituir subcadena/tag por otra cadena

Cita:
Iniciado por SkAr88 Ver Mensaje
Se supone que estas buscando y reemplazando tags en una variable, guardando el resultado en esa misma variable, a lo que yo entiendo segun el manual de php.net es que el resultado se sebe guardar en otra variable y no en la misma que estas buscando. Por lo menos asi lo.entiendo yo
Cierto, tienes razón. He cambiado mi código a lo siguiente, pero sigue sin funcionar, puesto que no introduce valores en $_SESSION['randomresult']['questions'][$i]['question'], pero las preguntas aleatorias sí las devuelve en el array del return.

Código PHP:
Ver original
  1. //obtengo de la BD todos los tags y los meto en array
  2.         $select = "SELECT * FROM tags";
  3.         $get    = $newget2->conectar( $select );
  4.         while ( $result_conexion = mysqli_fetch_array( $get ) )
  5.         {
  6.             $tags[] = $result_conexion['tag'];
  7.         }
  8.        
  9.         //declaro questions como array
  10.         $questions = array();
  11.        
  12.         //busco 5 preguntas aleatorias
  13.         //y sustituyo [nombre] por el valor que deseo finalmente
  14.         for($i=0; $i<=4 ; $i++)
  15.            
  16.         {
  17.             //obtengo 5 numeros aleatorios
  18.             $getquestionrandom      = $newget->getrandomvalue ( $getquestions );
  19.            
  20.             //guardo las preguntas segun los numeros anteriores
  21.             array_push($questionsrandom, $getquestions[$getquestionrandom]);
  22.            
  23.             //busco en las preguntas los tags
  24.             if ( in_array( $tags, $questionsrandom[$i] ) )
  25.             {
  26.                 //reemplazo los tags por el valor y finalmente lo guardo
  27.                 $_SESSION['randomresult']['questions'][$i]['question'] =
  28.                 str_ireplace ( $tags['tag'], "@".$_SESSION['randomresult']['friend']['screen_name'],
  29.                   $questionsrandom[$i]['question'] );
  30.             }
  31.         }
  32.         return $questionsrandom;

sigo pensando que el problema está en el str_ireplace y no sé por qué :S
__________________
Ayúdame a hacerlo por mi mismo.
  #10 (permalink)  
Antiguo 01/10/2013, 14:58
Avatar de xSkArx  
Fecha de Ingreso: marzo-2008
Ubicación: Chile
Mensajes: 945
Antigüedad: 16 años, 1 mes
Puntos: 96
Respuesta: Problema al sustituir subcadena/tag por otra cadena

Entonces haz un vardump de cada variable que esta en el str_ireplace() y asi puedes que pilles el error
__________________
Busca, lee y practica todo lo que puedas.
Usa siempre el buscador antes de postear.
Si posteas código, utiliza el HIGHLIGHT correcto.
  #11 (permalink)  
Antiguo 01/10/2013, 16:01
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Problema al sustituir subcadena/tag por otra cadena

Cita:
Iniciado por SkAr88 Ver Mensaje
Entonces haz un vardump de cada variable que esta en el str_ireplace() y asi puedes que pilles el error
Haciendo pruebas, definitivamente hay dos errores graves.

El 1º es que in_array() no funciona. He retornado una variable con el valor que genera in_array() y el resultado es false.

El 2º, es que ignorando el anterior directamente he comentado el if y ejecutado el str_ireplace, no funciona. Introduce los valores en la sesión, pero sin reemplazar. He comprobado que en la base de datos haya tags, que sean iguales a los que hay en las preguntas y no hay manera, no lo sustituye.

No entiendo por qué pasa esto :S
__________________
Ayúdame a hacerlo por mi mismo.
  #12 (permalink)  
Antiguo 01/10/2013, 18:22
Avatar de xSkArx  
Fecha de Ingreso: marzo-2008
Ubicación: Chile
Mensajes: 945
Antigüedad: 16 años, 1 mes
Puntos: 96
Respuesta: Problema al sustituir subcadena/tag por otra cadena

in_array() puede que mande FALSE porque es sensible a minúsculas y mayúsculas, podrias hacer algo asi:

Código PHP:
Ver original
  1. if ( in_array( strtolower($tags), strtolower($questionsrandom[$i] )))

si no funciona prueba con esto

Código PHP:
Ver original
  1. if(in_array(array_map('strtolower', $tags),array_map('strtolower',$questionsrandom[$i] )))
__________________
Busca, lee y practica todo lo que puedas.
Usa siempre el buscador antes de postear.
Si posteas código, utiliza el HIGHLIGHT correcto.
  #13 (permalink)  
Antiguo 02/10/2013, 05:56
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Problema al sustituir subcadena/tag por otra cadena

Cita:
Iniciado por SkAr88 Ver Mensaje
in_array() puede que mande FALSE porque es sensible a minúsculas y mayúsculas, podrias hacer algo asi:

Código PHP:
Ver original
  1. if ( in_array( strtolower($tags), strtolower($questionsrandom[$i] )))

si no funciona prueba con esto

Código PHP:
Ver original
  1. if(in_array(array_map('strtolower', $tags),array_map('strtolower',$questionsrandom[$i] )))
Si te lo digo alucinas.

En la línea 37 del primer código que he puesto aquí verás que lo que hago es meter en array todas las tags. Al especificar que solo se introduzca en $tag el result_conexion['tag'] no se estaba introduciendo en $tag la key que hay en la tabla llamada 'tag', por lo que al especificar en el in_array el parámetro $tag['tag'] es indicarle un valor que no existe. lo mismo en el str_ireplace.

Ese error me ha costado un día entero :S fuc fuc fuc :D

Ahora el str_ireplace solo hace el reemplazo en la primera pregunta, no en las 4 restantes. Si se te ocurre a ti o a alguien una solución, soy todo ojos :D

Muchas gracias por tu ayuda SkAr88 te pongo los positivos, te los has ganado!! :D
__________________
Ayúdame a hacerlo por mi mismo.
  #14 (permalink)  
Antiguo 02/10/2013, 07:28
Avatar de xSkArx  
Fecha de Ingreso: marzo-2008
Ubicación: Chile
Mensajes: 945
Antigüedad: 16 años, 1 mes
Puntos: 96
Respuesta: Problema al sustituir subcadena/tag por otra cadena

Probaste haciendo esto?

Código PHP:
Ver original
  1. $query="select tags from tags";
  2. $rs=mysql_query($query);
  3. $tags[]=mysql_fetch_array($rs);
__________________
Busca, lee y practica todo lo que puedas.
Usa siempre el buscador antes de postear.
Si posteas código, utiliza el HIGHLIGHT correcto.
  #15 (permalink)  
Antiguo 02/10/2013, 11:17
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Problema al sustituir subcadena/tag por otra cadena

Cita:
Iniciado por SkAr88 Ver Mensaje
Probaste haciendo esto?

Código PHP:
Ver original
  1. $query="select tags from tags";
  2. $rs=mysql_query($query);
  3. $tags[]=mysql_fetch_array($rs);
No, de todas formas eso ya lo solucioné, simplemente quitando el ['tag'] de $result_conexion.

Ahora el problema está con los reemplazos. Jeje, no lo consigo ni con expresiones regulares :S
__________________
Ayúdame a hacerlo por mi mismo.
  #16 (permalink)  
Antiguo 02/10/2013, 12:21
Avatar de xSkArx  
Fecha de Ingreso: marzo-2008
Ubicación: Chile
Mensajes: 945
Antigüedad: 16 años, 1 mes
Puntos: 96
Respuesta: Problema al sustituir subcadena/tag por otra cadena

Y como lo estas haciendo?
__________________
Busca, lee y practica todo lo que puedas.
Usa siempre el buscador antes de postear.
Si posteas código, utiliza el HIGHLIGHT correcto.
  #17 (permalink)  
Antiguo 02/10/2013, 16:23
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Problema al sustituir subcadena/tag por otra cadena

Cita:
Iniciado por SkAr88 Ver Mensaje
Y como lo estas haciendo?
Así

Código PHP:
Ver original
  1. $_SESSION['randomresult']['questions'][$i]['question'] =
  2. preg_replace ( "/(".$tags['tag'].")/",
  3. "@".$_SESSION['randomresult']['friend']['screen_name'],
  4. $questionsrandom[$i]['question'] );

Se supone que el patrón es una palabra entera (he quitado los corchetes '[' ']' para que no tuviera más problemas de los que ya tengo) envuelta entre paréntesis.
En definitiva, el patrón que le estoy pasando es
Código PHP:
Ver original
  1. /(name)/
Efectivamente me hace el reemplazo, pero me sustituye todos los caracteres por el screen_name, por lo que si la pregunta de prueba es

Cita:
11name11
me termina sustituyendo todo, quedando la pregunta de prueba

Cita:
@pepe@pepen@pepea@pepem@pepee@pepe@pepe
Si te fijas detenidamente, ha sustituido los 1 por @pepe y además incluso ha intercalado @pepe entre las letras del patrón.

No lo entiendo, según todos los sitios donde he buscado información sobre expresiones regulares dicen que el contenido entre paréntesis es interpretado como una unidad indivisible. Un bloque donde los reemplazos se hacen según el contenido específico de los paréntesis, dando igual lo que haya delante o detrás de dicha coincidencia.

Voy a seguir haciendo pruebas a ver cómo lo soluciono jeje :D
__________________
Ayúdame a hacerlo por mi mismo.
  #18 (permalink)  
Antiguo 02/10/2013, 16:40
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Problema al sustituir subcadena/tag por otra cadena

Finalmente todo solucionado.

La sustitución la pude hacer quitando también los corchetes de $tags, puesto que al pasar el parámetro en pre_replace $tags['tag'] no existía, tenía que pasar $tag[0, 1, 2, ...]['tag']. Otro error fatal, tonto, pero error que no ví.

Gracias por tu ayuda!!! ahora sí funciona perfectamente todo.

Lo que voy a hacer es poner la sustitución en un método para que pueda hacer uso de ello más adelante por si hiciera falta y listo :D

Saludos!!!!
__________________
Ayúdame a hacerlo por mi mismo.

Etiquetas: cadena, mysql, select, sustituir
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:09.