Autor Tema: PHP Tips: preg_replace, array_map, array_keys & array_values  (Leído 13022 veces)

0 Usuarios y 5 Visitantes están viendo este tema.

Desconectado vlad

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 6351
    • Qualium.net
PHP Tips: preg_replace, array_map, array_keys & array_values
« : febrero 04, 2010, 08:33:59 am »
Casi siempre que se modifican cadenas de texto en PHP se necesita transformarlas, ya sea para adecuarlas a búsquedas o para eliminar palabras innecesarias o re ordenar totalmente el texto.

Pongamos un ejemplo: digamos que obtienen de un formulario de busqueda el nombre de un color para luego buscar los productos de ese color.

Bien, el problema es que los colores tienen muchas variantes de nombre (ej. rosado/rosa, naranja/anaranjado o incluso genero y cantidad: rojo/roja/rojos/rojas).

Por supuesto podrian hacer algo asi:

Código: [Seleccionar]
<?php
$verdarera_busqueda 
preg_replace('/roj[ao]s{0,1}/i','rojo',$busqueda);
?>


Lo cual convertiria "rojo", "rojos", "roja", "rojas" en simplemente "rojo".

Pero que sucede si son tantos colores??, hacer una linea completa por preg_replace por cada color es muy malo para la legibilidad del codigo.

De acuerdo, preg_replace acepta arrays como expresiones y remplazos.

Que tal si ahora hacemos esto:

Código: [Seleccionar]
<?php
$verdarera_busqueda 
preg_replace(array('/roj[ao]s{0,1}/i','/amarill[ao]{0,1}/i'), array('rojo''amarillo'), $busqueda);
?>


Mejor? talvez, pero con muchisimos colores seria una cadena muy larga e incomprensible (de hecho asi solo hay dos colores y ya se ve feo).

Así que, porque no ocupamos array_keys & array_values?

Código: [Seleccionar]
<?php
$array_colores 
= array('/roj[ao]s{0,1}/i' => 'rojo''/amarill[ao]s{0,1}/i' => 'amarillo');

$verdarera_busqueda preg_replace(array_keys($array_colores), array_values($array_colores), $busqueda);
?>


Esto esta mejor, considerando que el array se puede construir de forma mucho mas ordenada y el preg_replace se mantiene intacto.

Pero aun asi, repetimos innecesariamente el "/color[ao]s{0,1}/i" para cada color que queremos reemplazar, asi que aqui entra en juego array_map:

Código: [Seleccionar]
<?php
function __variar_color_callback($color)
{
    return 
'/'.$color.'[aeiou]s{0,1}/i';
}

$variaciones = array('rosad' => 'rosa''amarill' => 'amarillo''roj' => 'rojo''anarajad' => 'naranja');

$verdarera_busqueda preg_replace(array_map('__variar_color_callback',array_keys($variaciones)),array_values($variaciones),$busqueda);
?>


Ahora el array es super comprensible y se puede extender muchisimo mas facil que en cualquiera de los casos anteriores :).

Espero hayan aprendido algo nuevo en este mini-tip, y espero estar poniendo uno nuevo a la semana al menos  :thumbsup:

Si no conocen las funciones utilizadas pues no hay mejor recuerso que el propio PHP:

preg_replace
array_map
array_keys
array_values

Desconectado madolfo

  • Sv Member
  • ***
  • Mensajes: 155
Re:PHP Tips: preg_replace, array_map, array_keys & array_values
« Respuesta #1 : febrero 04, 2010, 09:05:46 am »
Excelente aporte maestro!!!.
Ya tengo idea de donde lo podre ocupar este tips.

Desconectado Edg

  • Sv Member
  • ***
  • Mensajes: 330
Re:PHP Tips: preg_replace, array_map, array_keys & array_values
« Respuesta #2 : febrero 04, 2010, 09:16:56 am »
Gracias por el tip, está bueno este tipo de posts, porque uno nunca llega a saber por completo las funciones de un lenguaje, en este caso PHP que es mi favorito.

Desconectado tekun

  • -^- Elite Silver -^-
  • The Communiter-
  • *
  • Mensajes: 3221
  • Han convertido mi casa en cueva de mercaderes!!!!
    • www.tekun.es
Re:PHP Tips: preg_replace, array_map, array_keys & array_values
« Respuesta #3 : febrero 24, 2010, 11:39:12 am »
jeee sorry, pero no le veo la utilidad... seguramente es porque no entendí tu thread?

pregunta: en que casos "prácticos" puedo ocupar este tip? osea, en que problema puedo estar, para poder utilizar esta solución?
lo difícil lo hago rápido, con lo imposible, casi siempre me tardo un poquito

Desconectado vlad

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 6351
    • Qualium.net
Re:PHP Tips: preg_replace, array_map, array_keys & array_values
« Respuesta #4 : febrero 24, 2010, 12:34:06 pm »
Si me quisiera safar facilmente te diria lo que todos los programadores dicen: "la utilidad del codigo es la que tu como programador le encuentres", lo cual es cierto pero solo es una excusa para no explicar.

Bien, realmente la idea del tema era explicar la utilidad de los comandos preg_replace, array_map, array_keys y array_values, no necesariamente insistiendo en ocuparlos como se muestra aqui, si no mostrando sus virtudes individuales.

Por ejemplo, tomemos array_map y una nueva funcion: mysql_real_escape_string.

Digamos que tenes un $_POST y queres pasarlos todos por esta funcion mysql_real_escape_string(), entonces puedes utilizar array_map de esta forma:

Código: [Seleccionar]
<?php
$POST 
array_map('mysql_real_escape_string',$_POST);?>


Cada funcion tiene bastantes ejemplos en su respetiva pagina de documentacion en el sitio de PHP, con el ejemplo que puse en el primer mensaje lo utilice para "normalizar" los terminos de busqueda en un pagina.

Desconectado tekun

  • -^- Elite Silver -^-
  • The Communiter-
  • *
  • Mensajes: 3221
  • Han convertido mi casa en cueva de mercaderes!!!!
    • www.tekun.es
Re:PHP Tips: preg_replace, array_map, array_keys & array_values
« Respuesta #5 : febrero 24, 2010, 01:01:49 pm »
Si me quisiera safar facilmente te diria lo que todos los programadores dicen: "la utilidad del codigo es la que tu como programador le encuentres", lo cual es cierto pero solo es una excusa para no explicar.
Exacto.

mi punto es, que me centre únicamente en el ejmplo que tu pusiste al inicio

Cita de: vlad
Pongamos un ejemplo: digamos que obtienen de un formulario de busqueda el nombre de un color para luego buscar los productos de ese color.
aja, viene el vicho tekun y se imagina una página web con un casilla de texto y un botoncito que dice buscar. esa página tiene un titulo que dice: "Búsqueda de productos por color" lo cual me dice que yo puedo buscar un producto "x"... digamos lapiceros, por el color de su tinta... cierto?

va hasta aquí chivo... pero luego vi, que lo que has echo es un parseo {no se si existe esa palabra XD} o normalización, para hacer la consulta a la base de datos por "un solo" termino...
Cita de: vlad
Lo cual convertiria "rojo", "rojos", "roja", "rojas" en simplemente "rojo".


ahí es donde ya no me cuaja esa práctica... si ese ejemplo y esa utilidad es una realidad y no un simple ejemplo esa página web que imagine no sirve.
lo difícil lo hago rápido, con lo imposible, casi siempre me tardo un poquito

Desconectado vlad

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 6351
    • Qualium.net
Re:PHP Tips: preg_replace, array_map, array_keys & array_values
« Respuesta #6 : febrero 24, 2010, 01:19:17 pm »
¿Porque no sirve?

Supon que la busqueda es busqueda en un almacen, estas son busquedas son textos totalmente distintos pero quieren el mismo resultado:

Buscar:
"lapiceros rojos"
"lapicero rojo"
"lapicero tinta roja"

La "normalizacion" convertiria todas esas busquedas en:
"lapiceros rojo"
"lapicero rojo"
"lapicero tinta rojo"

Desde lo cual puedes detectar un color en el texto de búsqueda para refinar los resultados convenientemente (ejemplo: alterando la consulta -automaticamente segun el caso claro- agregando un "and color='rojo'"), de lo contrario tendrias que poner todas las variaciones de genero/pluralismos o simplemente tendrias que confiar en que el motor de busqueda de la base de datos este optimizado para el español o degradar el desempeño de la busqueda utilzando comodines y evitando completamente el uso del indice.

Si aun no le hayas logica o sentido me gustaria a mi entender exactamente la causa?

Desconectado tekun

  • -^- Elite Silver -^-
  • The Communiter-
  • *
  • Mensajes: 3221
  • Han convertido mi casa en cueva de mercaderes!!!!
    • www.tekun.es
Re:PHP Tips: preg_replace, array_map, array_keys & array_values
« Respuesta #7 : febrero 24, 2010, 02:20:33 pm »
me lo temía

¿Porque no sirve?

 :) jeee, pos no sirve porque estamos hablando de un "atributo" del producto, no del producto como tal...

entonces el "color", debería ser un catálogo diferente, porque sino, es como que la base de datos sea un archivo plano, un simple txt donde ahí si debes hacer la "normalizacion"...

no debes de permitir que el usuario escriba o ingrese en la tabla esto:
Cita de: vlad
"lapiceros rojos"
"lapicero rojo"
"lapicero tinta roja
el debe elegir nada más, el tipo de producto y el color, como código no como texto... para evitar el trabajo de normalizar las consultas
lo difícil lo hago rápido, con lo imposible, casi siempre me tardo un poquito

Desconectado vlad

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 6351
    • Qualium.net
Re:PHP Tips: preg_replace, array_map, array_keys & array_values
« Respuesta #8 : febrero 24, 2010, 03:11:57 pm »
en lo personal opino que en sistemas cerrados (ej. donde hay un grupo definido de propiedades/atributos para los productos y una afinidad muy cercana entre ellos, ej. un sistema de inventario para partes de automoviles o consulta de libros en biblioteca) si creo que si es ideal hacerlo asi como dices, dejando las opciones nada mas a escoger.

Pero en sistemas mas abiertos donde la busqueda es mucho mas dinámica (o donde particularmente el query de busqueda se construye dinamicamente para obtener hasta el ultimo beneficio posible) y cuando algunas propiedades pueden o no estar relacionadas con los productos en el sistema el sistema de busqueda no puede permitir mostrar un "combobox" por cada atributo posible.

Tomemos como ejemplo Ebay, el sistema de busqueda tiene que normalizar porque son tantos posibles atributos que te mostraria muchisimos combobox o listas de donde escoger.

Por ejemplo al buscar por un carro te puede interesar la marca y modelo, cuando buscas una ropa quiza la marca y el color, si busca por memorias ram seria la capacidad, velocidad y tipo.

Mostrar opciones para cada posible atributo seria imposibilitar la busqueda, de ahi la necesidad de la "normalizacion" en la busqueda a mi modo de ver.

Desconectado tekun

  • -^- Elite Silver -^-
  • The Communiter-
  • *
  • Mensajes: 3221
  • Han convertido mi casa en cueva de mercaderes!!!!
    • www.tekun.es
Re:PHP Tips: preg_replace, array_map, array_keys & array_values
« Respuesta #9 : febrero 24, 2010, 03:34:56 pm »
:) pos yo no he dicho que no debes utilizar la normalización de consultas, porque como tu muy bien dices, hay lugares donde sí aplica...

a lo que me refería es al ejemplo de lapiceros y sus colores... pero para un sitio de Ventas por internet debes de utilizar ésta práctica con todas las de la ley...
lo difícil lo hago rápido, con lo imposible, casi siempre me tardo un poquito

Desconectado g00mba

  • The Communiter-
  • *
  • Mensajes: 14587
  • SOMOS LEGION
    • ALABADO SEA MONESVOL
Re:PHP Tips: preg_replace, array_map, array_keys & array_values
« Respuesta #10 : febrero 24, 2010, 03:35:57 pm »
ahi estamos a un 50% por ciento de acuerdo vlad, pero el método que recomendas vos, en un sitio de mediano a gran tamanio se puede volver realmente dificil de implementar y mantener, hay algoritmos que se encargan automáticamente de esto, se llaman fuzzy search, en wikipedia esta como Approximate string matching
aunque si puedo ver la utilidad de los metodos q propones, como por ejemplo una tecnica tidy para direcciones de páginas.
« Última Modificación: febrero 24, 2010, 03:37:36 pm por g00mba »

Desconectado tekun

  • -^- Elite Silver -^-
  • The Communiter-
  • *
  • Mensajes: 3221
  • Han convertido mi casa en cueva de mercaderes!!!!
    • www.tekun.es
Re:PHP Tips: preg_replace, array_map, array_keys & array_values
« Respuesta #11 : febrero 24, 2010, 04:04:10 pm »
esa práctica puede variar dependiendo del RDBMS que uses... por ejemplo en mi amado Postgres estan los FTS parsers/dictionaries/Templates que hacen la busqueda
lo difícil lo hago rápido, con lo imposible, casi siempre me tardo un poquito

Desconectado g00mba

  • The Communiter-
  • *
  • Mensajes: 14587
  • SOMOS LEGION
    • ALABADO SEA MONESVOL
Re:PHP Tips: preg_replace, array_map, array_keys & array_values
« Respuesta #12 : febrero 24, 2010, 04:04:37 pm »
ah mira encontre una implementacion de fuzzy search q te puede parecer interesante
http://elonen.iki.fi/code/misc-notes/appr-search-php/

Desconectado vlad

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 6351
    • Qualium.net
Re:PHP Tips: preg_replace, array_map, array_keys & array_values
« Respuesta #13 : febrero 24, 2010, 04:43:53 pm »
ahi estamos a un 50% por ciento de acuerdo vlad, pero el método que recomendas vos, en un sitio de mediano a gran tamanio se puede volver realmente dificil de implementar y mantener, hay algoritmos que se encargan automáticamente de esto, se llaman fuzzy search, en wikipedia esta como Approximate string matching
aunque si puedo ver la utilidad de los metodos q propones, como por ejemplo una tecnica tidy para direcciones de páginas.

En un sitio grande es donde mas utilidad le encuentro yo :), un sitio grande = mas contenido = mas posibilidades de que la gente no encuentre algo si pone una letra de mas.

esa práctica puede variar dependiendo del RDBMS que uses... por ejemplo en mi amado Postgres estan los FTS parsers/dictionaries/Templates que hacen la busqueda

Muy bonito el Postgres, los sinonimos vendrian muy bien en este caso. Obviamente no me voy a poner a discutir sobre la nula portabilidad de usarlo a nivel del RDBMS que se use (puesto que hacerlo a nivel del lenguaje de programacion, para el caso PHP, seria hacerlo independiente de la tecnlogia de la RDBMS).

En otra nota aparte, y como lo comente contigo en otro tema (http://www.svcommunity.org/forum/base-de-datos/postgres-8-4-ha-sido-liberado/) sigue siendo una lastima que siga tan fuera de los ofrecimientos estandar de los servidores web.



Por cierto, lo de http://elonen.iki.fi/code/misc-notes/appr-search-php/ valdra la pena probarlo y ver que tan bien se lleva con el español :)

Desconectado g00mba

  • The Communiter-
  • *
  • Mensajes: 14587
  • SOMOS LEGION
    • ALABADO SEA MONESVOL
Re:PHP Tips: preg_replace, array_map, array_keys & array_values
« Respuesta #14 : febrero 24, 2010, 05:04:47 pm »
En un sitio grande es donde mas utilidad le encuentro yo :), un sitio grande = mas contenido = mas posibilidades de que la gente no encuentre algo si pone una letra de mas.

Muy bonito el Postgres, los sinonimos vendrian muy bien en este caso. Obviamente no me voy a poner a discutir sobre la nula portabilidad de usarlo a nivel del RDBMS que se use (puesto que hacerlo a nivel del lenguaje de programacion, para el caso PHP, seria hacerlo independiente de la tecnlogia de la RDBMS).

esque utilidad en un sitio grande claro que tiene, lo que considero un poco rudo es la forma de implemtarlo, porque segun entiendo tendrias que poner todas las posibles variables de cada palabra ,y hacer eso con un inventario de 1000 articulos ponele, y que cada articulo tenga 15 posibles variaciones de nombre serian 15000 posibilidades, y a eso sumale q esten aniadiendo articulos constantemente, seria de q pusieras a alguien solo para eso.