Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Función in_array y acentos

Estas en el tema de Función in_array y acentos en el foro de PHP en Foros del Web. Buenos días, Estoy creando una plataforma para mi página web, pero me encuentro con una dificultad: necesito usar la función in_array para comparar si un ...
  #1 (permalink)  
Antiguo 09/11/2015, 11:27
 
Fecha de Ingreso: agosto-2015
Ubicación: Barcelona
Mensajes: 16
Antigüedad: 8 años, 8 meses
Puntos: 0
Función in_array y acentos

Buenos días,

Estoy creando una plataforma para mi página web, pero me encuentro con una dificultad: necesito usar la función in_array para comparar si un elemento X está presente en la array Y. El problema es que a veces ese elemento X lleva acento, y no sé por qué, aunque en el array Y ese elemento lleve también acento, no me detecta que X está contenido en Y.

Estoy usando el siguiente código:
Código PHP:
$et mb_strtolower($_POST["etiqueta"],"UTF-8");
$et explode(", ",$et);
$num count($et);
$afirmacion 3;
for(
$t=0;$t<$num;$t++)
{
    if(
in_array($et[$t],$etiquetas1)) {
    if(
$afirmacion != 0) {
    
$afirmacion 1;
    }
    }
    else 
    {
        
$afirmacion 0;
    }

Por poneros un ejemplo:

Tenemos la array X: Array ( [0] => transformación digital )
Y la array Y: Array ( [0] => digitalización [1] => experiencia del cliente [2] => internet [3] => modelos operativos [4] => transformación digital [5] => nuevas tendencias [6] => nuevas tecnologías [7] => desarrollo empresarial )

Si uso la función in_array para buscar si X[0] está contenido en Y, no me detecta que sí lo está (Y[4]). En cambio, si la array X fuera "experiencia del cliente" en lugar de "transformación digital", sí me detectaría que está contenido en Y.

¿Cómo puedo hacer para que la función in_array continúe haciendo bien su trabajo aunque las cadenas tengan acentos?

Última edición por architelos; 09/11/2015 a las 11:34
  #2 (permalink)  
Antiguo 09/11/2015, 11:52
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Función in_array y acentos

Cita:
¿Cómo puedo hacer para que la función in_array continúe haciendo bien su trabajo aunque las cadenas tengan acentos?
¿En el manual no dice si existen restricciones cuando tratas de comparar cadenas con acentos?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 09/11/2015, 12:43
 
Fecha de Ingreso: agosto-2015
Ubicación: Barcelona
Mensajes: 16
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Función in_array y acentos

Si te refieres a este manual (http://php.net/manual/es/function.in-array.php), no encuentro nada referente a los acentos. He buscado bastante en Google y no he encontrado demasiada información, por eso he creado el post.
  #4 (permalink)  
Antiguo 09/11/2015, 13:19
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Función in_array y acentos

Definitivamente, acabo de leer el manual de in_array() y no hace mención al respecto, lo más probable es que haga una comparación natural indistintamente de si hay o no acentos, unicode, etc.

Creo que vas a tener que implementar tu propio "in_array" para que soporte estos detalles.

Básicamente la firma sería algo así:
Código PHP:
Ver original
  1. function in_mb_array($needle, $array_of_text) {
  2.   foreach ($array_of_text as $i => $str) {
  3.     if (mb_strpos($str, $needle) !== false) {
  4.       return $i;
  5.     }
  6.   }
  7.  
  8.   return -1;
  9. }
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 09/11/2015, 18:03
 
Fecha de Ingreso: agosto-2015
Ubicación: Barcelona
Mensajes: 16
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Función in_array y acentos

Muchas gracias por tu ayuda, compañero pateketrueke. Estoy intentando comprender el código, y no solo implantarlo tal cual, para poder dar respuesta por mí mismo si vuelvo a toparme con un problema similar. Es decir, al usar la función in_mb_array($needle,$array_of_text), ¿qué valor devolvería? Mi intención es que devuelva true si el valor X está contenido en el array Y, o false si no está contenido. Mi problema es que no comprendo bien el uso de foreach, más allá de lo que he leído en el manual.
  #6 (permalink)  
Antiguo 09/11/2015, 19:43
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: Función in_array y acentos

Saludo
Pues con el código original me funciona

Ej
Código PHP:
$_POST['etiqueta'] = 'transformación digital';
$etiquetas1 = array('digitalización''experiencia del cliente''internet','modelos operativos''transformación digital''nuevas tendencias''nuevas tecnologías''desarrollo empresarial'); 

Da como resultado que afirmacion es 1.

¿No será que como sigue en el ciclo, y comparando los demás,
alguno no concuerde, sea por espacios, por ej?
Hacerle un trim al valor recibido de post por sí acaso.
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #7 (permalink)  
Antiguo 10/11/2015, 02:30
 
Fecha de Ingreso: agosto-2015
Ubicación: Barcelona
Mensajes: 16
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Función in_array y acentos

Gracias por tu respuesta, mortiprogramador. He probado con otros ejemplos, y definitivamente el problema son los acentos:

Código PHP:
$_POST['etiqueta'] = 'digitalización;
$etiquetas1 = array('
digitalización', 'experiencia del cliente); 
Son este ejemplo, no me funciona. En cambio, si busco 'experiencia del cliente', el resultado es positivo.
  #8 (permalink)  
Antiguo 10/11/2015, 02:36
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: Función in_array y acentos

Saludo
Acabo de probar con lo que posteaste, y funciona.
Lo único fue que le agregué la comilla de cierre en ambos casos,
en tu post falta el cierre.
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #9 (permalink)  
Antiguo 10/11/2015, 05:53
 
Fecha de Ingreso: agosto-2015
Ubicación: Barcelona
Mensajes: 16
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Función in_array y acentos

Cita:
Iniciado por mortiprogramador Ver Mensaje
Saludo
Acabo de probar con lo que posteaste, y funciona.
Lo único fue que le agregué la comilla de cierre en ambos casos,
en tu post falta el cierre.
Sí, me equivoqué al escribirlo en el foro, yo lo probé con la comilla de cierre bien puesta. Ahora bien, ¿por qué a ti te funcionan los acentos y a mí no? ¿Tendrá que ver con la codificación del conjunto de la página, con la versión de PHP...?

Y respecto al código de pateketrueke, estoy muy interesado en entenderlo. Al usar la función in_mb_array($needle,$array_of_text), ¿qué valor devolvería? Mi intención es que devuelva true si el valor X está contenido en el array Y, o false si no está contenido.
  #10 (permalink)  
Antiguo 10/11/2015, 10:01
Avatar de ArturoGallegos
Moderador
 
Fecha de Ingreso: febrero-2008
Ubicación: Morelia, México
Mensajes: 6.774
Antigüedad: 16 años, 1 mes
Puntos: 1146
Respuesta: Función in_array y acentos

Se observador

$i representa la key en el array que contiene el valor buscado por ende te si lo que buscas esta en el tercer elemento te devolverá 2 si esta en el quinto elemento te devolverá 4

Si lo que quieres es que te devuelva true o false según del caso solo cambia el return $i por retun true

y en lugar de retun -1 cambia por retun false
  #11 (permalink)  
Antiguo 10/11/2015, 11:48
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: Función in_array y acentos

Saludo
Pues propongo que pruebes en un archivo nuevo,
no en el que estás probando.
Sí funciona, entonces es algo en ese archivo,
o en alguno que se incluye.

Igualmente, sí la información viene de una base de datos,
puede ser de allá el tema.

Así el asunto, intenta en un archivo nuevo con datos fijos,
es decir, datos contenidos en variables y arrays.

En cuanto al código de pateketrueke, ya ArturoGallegos aclaró el tema.
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #12 (permalink)  
Antiguo 10/11/2015, 14:34
 
Fecha de Ingreso: agosto-2015
Ubicación: Barcelona
Mensajes: 16
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Función in_array y acentos

Muchas gracias por tu respuesta, ArturoGallegos. He probado el código de pateketrueke con la modificación que has indicado, y funciona perfectamente, excepto si la palabra es acentuada. El problema en este sentido persiste. Voy a hacer las pruebas que sugiere mortiprogramador, a ver si esclarecemos si el problema es efectivamente del archivo.
  #13 (permalink)  
Antiguo 10/11/2015, 15:09
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Función in_array y acentos

Hola architelos,

Te recomiendo que revises la codificación de los archivos, ese tema puede dar muchos quebraderos de cabeza, a ver si hay suerte y con eso lo solucionas.
  #14 (permalink)  
Antiguo 12/11/2015, 06:54
 
Fecha de Ingreso: agosto-2015
Ubicación: Barcelona
Mensajes: 16
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Función in_array y acentos

Efectivamente, el problema no es de la versión PHP ni del servidor, sino de mi código en particular. Veréis, he hecho el siguiente experimento: he creado un .php con el programa que uso para editar (Notepad++) en el que solo he colocado dos arrays, y la función in_array. El programa funcionaba tanto si había como si no había acentos. Así, descarté que se tratara de un error del servidor o de la versión. Luego, he copiado y pegado en ese .php todo el código de mi .php principal, y lo he subido. Al contener el nuevo código, ya no funcionaba la función in_array si había acentos. Así, he descartado que se trate de un error en la codificación del archivo.

La conclusión es que el problema solo puede estar en el código, pero el problema se me resiste.
  #15 (permalink)  
Antiguo 12/11/2015, 08:04
 
Fecha de Ingreso: agosto-2015
Ubicación: Barcelona
Mensajes: 16
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Función in_array y acentos

¡He encontrado la solución!

Realmente soy estúpido. El problema estaba en la definición de $etiquetas1, ya que la realizaba del siguiente modo:

Código PHP:
$etiquetas htmlentities($row["etiquetas"]);
$etiquetas1 explode(", ",$etiquetas);
$etiquetas ucwords($etiquetas", "); 
Básicamente, el problema era que al aplicar el htmlentities, cambiaba los acentos por los códigos html (&aacute; y demás). La solución, muy simple:

Código PHP:
$etiquetas1 explode(", ",$row["etiquetas"]);
$etiquetas ucwords(htmlentities($row["etiquetas"]),", "); 
Muchas gracias a los que me habéis intentado ayudar, realmente no podíais darme la solución porque no posteé la parte del código en la que definía el array. Realmente un fallo de principiante.

Etiquetas: acentos
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 08:23.