Foros del Web » Programando para Internet » PHP »

Algoritmo de Búsqueda Profunda.

Estas en el tema de Algoritmo de Búsqueda Profunda. en el foro de PHP en Foros del Web. Hola, estoy realizando un sistema, este sistema se trata de una búsqueda y extraer el dato encontrado, el cual esto va a estar limitado por ...
  #1 (permalink)  
Antiguo 26/11/2011, 09:25
 
Fecha de Ingreso: noviembre-2011
Ubicación: Lima
Mensajes: 5
Antigüedad: 12 años, 5 meses
Puntos: 0
Algoritmo de Búsqueda Profunda.

Hola, estoy realizando un sistema, este sistema se trata de una búsqueda y extraer el dato encontrado, el cual esto va a estar limitado por unos caracteres.

por decir tengo la $cadena que viene de una tabla de la base de datos lo que quiero obtener es: buenos aires, 289, C, 29, San Isidro, Lima, y esto guardarlo en cada tabla se trata de normalización, bueno he desarrollado este algoritmo que si me extrae lo que quiero, el problema es que cuando la cadena extraída estee como la $cadena1 me imprimirá en pantalla esto: Buenos aires Dst. San Isidro Dpto. Lima,el cual esto es erróneo en la avenida. para ello tengo que elaborar una función con dos parámetros ExtraerFrase('datoinicial',cadenaabuscar);, y que el segundo limitador estee codificado del tal forma que me imprima la cadena intermedia entre el carácter inicial y el carácter final.

Caracteres limitadores: Av. , N. , Mz. , Lt. , Dst. , Dpto. etc, Ojo estos datos están en una tabla de la base de datos.

el código es:

$cadena = "Av. Buenos aires N. 289 Mz. C Lt. 29 Dst. San Isidro Dpto. Lima";
$cadena = "Av. Buenos aires Dst. San Isidro Dpto. Lima N. 289 Mz. C Lt. 29";
$cadena1 = "Av. Buenos aires Dst. San Isidro Dpto. Lima N. 289 Mz. C Lt. 29";

función desarrollada:echo ExtraerFrase('Av.','N.',$cadena);

funcion que quiero es: ExtraerFrase('Av.',$cadena);

y que me imprima en los dos casos solo: Buenos aires

Me imprime en pantalla: Buenos aires
$cadena1 me imprime: Buenos aires Dst. San Isidro Dpto. Lima, erróneo.

function ExtraerFrase($estinicial,$estfinal,$cadena)
{
if(strpos($cadena,$estinicial)!==false)
{
$pos=strpos($cadena,$estinicial);
$a=substr($cadena,$pos+strlen($estinicial));
if(strpos($a,$estfinal)!==false)
{
$npos=strpos($a,$estfinal);
$b=substr($a,0,$npos);
return $b;
}
else
return $a;
}
else
return false;
}


Por favor si tienes un algoritmo en PHP que interactivo con la base de datos para la solución de este caso, plis una manito para lograr mi objetivo. o algunas sugerencias que teneis que hacer me lo dice por el foro.

Espero haberme explicado con claridad.

Cualquier cosa os dejo mi correo [email protected]

Gracias...
  #2 (permalink)  
Antiguo 26/11/2011, 14:42
Avatar de charlyalegret  
Fecha de Ingreso: septiembre-2011
Ubicación: Barcelona
Mensajes: 705
Antigüedad: 12 años, 6 meses
Puntos: 140
Respuesta: Algoritmo de Búsqueda Profunda.

supongo que extraes de la cadena desde el limitador inicial Av. al final N.

Si repitieses la operación con todos los limitadores finales diferentes al inicial (N. , Mz. , Lt. , Dst. , Dpto. etc), y luego buscases la cadena más corta, esa sería "Buenos aires"
  #3 (permalink)  
Antiguo 26/11/2011, 21:33
 
Fecha de Ingreso: noviembre-2011
Ubicación: Lima
Mensajes: 5
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Algoritmo de Búsqueda Profunda.

supongo que extraes de la cadena desde el limitador inicial Av. al final N.

Si repitieses la operación con todos los limitadores finales diferentes al inicial (N. , Mz. , Lt. , Dst. , Dpto. etc), y luego buscases la cadena más corta, esa sería "Buenos aires"


Exacto esa es la lógica, mi problema es como codificarlo el limitador del carácter final que por cierto estos caracteres vienen de la base de datos, ok...

¿Como codifico el carácter final para luego buscar el siguiente carácter mas corto y extraer la cadena intermedia por los caracteres limitadores?

Si me compartes la función seria genial te lo agradecería mucho, se que es fácil.

Os agradezco sus comentarios...
  #4 (permalink)  
Antiguo 26/11/2011, 22:18
Avatar de Sourcegeek
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: $mex['B.C.'];
Mensajes: 1.816
Antigüedad: 14 años, 11 meses
Puntos: 322
Respuesta: Algoritmo de Búsqueda Profunda.

Podrías usar preg_match para obtener las dos o tres palabras siguientes a la abreviatura inicial. Busca en el foro, hay un aporte de Expresiones Regulares que ayudará a formular lo que necesitas.

Saludos
__________________
Buscas desarrollador web? Sourcegeek. Diseño web, Maquetación y Programación
¡Escribe bien! Esto es un foro, no un Facebook para que escribas con los pies
  #5 (permalink)  
Antiguo 27/11/2011, 09:10
 
Fecha de Ingreso: noviembre-2011
Ubicación: Lima
Mensajes: 5
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Algoritmo de Búsqueda Profunda.

Hola:
gracias por las intervenciones y los aportes, ia lo prove con el preg_match y no me funciona como quiero, se que es una comparación sucesiva del carácter final mas cercano, el problema es que no se como....soy algo nuevo en este mundo de la programación en PHP.

Gracias!!!

[URL="http://www.lgvmasterweb.com"]Lgvmasterweb S.A.C[/URL]
  #6 (permalink)  
Antiguo 27/11/2011, 14:02
Avatar de Sourcegeek
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: $mex['B.C.'];
Mensajes: 1.816
Antigüedad: 14 años, 11 meses
Puntos: 322
Respuesta: Algoritmo de Búsqueda Profunda.

¿Por qué no nos enseñas lo que hiciste? Así podemos ver que está mal y ayudarte con ello.
__________________
Buscas desarrollador web? Sourcegeek. Diseño web, Maquetación y Programación
¡Escribe bien! Esto es un foro, no un Facebook para que escribas con los pies
  #7 (permalink)  
Antiguo 27/11/2011, 17:48
 
Fecha de Ingreso: noviembre-2011
Ubicación: Lima
Mensajes: 5
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Algoritmo de Búsqueda Profunda.

Este es el logaritmo que estoy utilizando.

$cadena : Esto viene de una tabla de la base de datos base de datos.
Caracteres limitador final como: Av. , N. , Mz. , Lt. ,Dst. ,etc, también viene de una tabla de la BD.

$cadena = "Av. Buenos aires N. 289 Mz. C Lt. 29 Dst. SJL";
echo ExtraerFrase('Av.',$cadena)."<BR><BR><BR>";

function ExtraerFrase($estinicial,$cadena)
{
if(strpos($cadena,$estinicial)!==false)
{
$pos=strpos($cadena,$estinicial);
$a=substr($cadena,$pos+strlen($estinicial));

/*HACIENDO ALGORITMO DE BUSQUEDA INTELIGENTE*/
/*END DEL ALGORITMO DE BUSQUEDA INTELIGENTE*/

//if(strlen($a)>'N.'){}
/**/
//if (isset($estinicial)){echo $dato=$estinicial;}/*obtenemos el primer dato*/


//se dan cuenta acá limito el carácter final y esto es mi problema. pensemos que esto no siempre es N. //tiene que ser el mas cercano al primer carácter. para extraer el central.

if(strpos($a,'N.')!==false)
{
$npos=strpos($a,'N.');
$b=substr($a,0,$npos);
$long = trim(strlen($b));
echo $long;
return $b;
}
else
return $a;
}
else
return false;

}


Gracias por su atención y su ayuda ok... trato de ser lo mas cloro posible.
  #8 (permalink)  
Antiguo 27/11/2011, 18:59
Avatar de Sourcegeek
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: $mex['B.C.'];
Mensajes: 1.816
Antigüedad: 14 años, 11 meses
Puntos: 322
Respuesta: Algoritmo de Búsqueda Profunda.

Habías mencionado que utilizaste preg_match.. ¿Dónde está ese código?

PD: Trata de usar el Highlighter del foro, para eso está. Es muy incómodo leer código sin resaltamiento y en negritas...
__________________
Buscas desarrollador web? Sourcegeek. Diseño web, Maquetación y Programación
¡Escribe bien! Esto es un foro, no un Facebook para que escribas con los pies
  #9 (permalink)  
Antiguo 02/12/2011, 15:29
 
Fecha de Ingreso: noviembre-2011
Ubicación: Lima
Mensajes: 5
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Algoritmo de Búsqueda Profunda.

Gracias ahí les dejo mi código... dígame si esta bien...
conectar.php
Código PHP:
Ver original
  1. function coneccion()
  2. {
  3.     $host = "localhost";
  4.     $username = "root";
  5.     $password = "123456";
  6.     $bd="demo";
  7.     $connection = mysql_connect($host,$username,$password);
  8.         $basedatos = mysql_select_db($bd,$connection);
  9.        
  10.     if (!$connection)
  11.     {          
  12.         return "FRACASO";
  13.     }
  14.    
  15.     if (!$basedatos)
  16.     {
  17.                 return "NO SE PUDO CoNECTAR A LA BASE DE DATOS";
  18.     }
  19.                
  20.     if ($connection && $basedatos)
  21.     {          
  22.         return $connection;
  23.     }
  24. }

funcion.php
Código PHP:
Ver original
  1. function distribuir_direccion($cadena,$cn)
  2. {
  3.  
  4. $data = explode(' ',$cadena);
  5. //echo count($data);
  6. //if(strtoupper($data[0]) == 'AV.')
  7. $avenida='';
  8. $p=0;
  9. $m=0;
  10. $cantidad=0;
  11. for($i=1;$i<count($data);$i++)
  12. {
  13.             if(verificar(strtoupper($data[$i]),$cn))
  14.             {
  15.             $array = explode(' ',trim($avenida));
  16.             $cantidad += count($array) + 1;
  17.            
  18.             $conta[$p] = $data[$m].' '.$avenida;
  19.             $avenida='';
  20.             $p++;
  21.             $m = $cantidad;
  22.             }
  23.             else
  24.             {
  25.             $avenida.=$data[$i].' ';
  26.             }
  27.  
  28. }
  29.  
  30. $conta[count($conta)] = $data[$m].' '.$avenida;//ultimo trazo de la cadena principal
  31.  
  32. //echo count($conta);
  33.  
  34. //-------------------------------------------------INSERTAMOS CADA CADENA EN SU TABLA RESPECTIVA
  35.  
  36. for($n=0;$n<count($conta);$n++)
  37. {
  38. $descompone = explode(' ',$conta[$n],2);// descompone la direccion en cabecera(AV, MZ, JR) y en el cuerpo (nombre)
  39.  
  40.             //condiciones para insertar en las tablas respectivas
  41.             if(strtoupper($descompone[0])=='Av.')
  42.             {
  43.             $insert = "insert into avenidas values(0,'$descompone[1]')";
  44.             mysql_query($insert,$cn);
  45.             }
  46.            
  47.             if(strtoupper($descompone[0])=='Mz.')
  48.             {
  49.             $insert = "insert into manzanas values(0,'$descompone[1]')";
  50.             mysql_query($insert,$cn);
  51.             }
  52.            
  53.             if(strtoupper($descompone[0])=='Pje.')
  54.             {
  55.             $insert = "insert into pasajes values(0,'$descompone[1]')";
  56.             mysql_query($insert,$cn);
  57.             }
  58.            
  59.             if(strtoupper($descompone[0])=='Jr.')
  60.             {
  61.             $insert = "insert into jiron values(0,'$descompone[1]')";
  62.             mysql_query($insert,$cn);
  63.             }
  64.            
  65.             if(strtoupper($descompone[0])=='Ca.')
  66.             {
  67.             $insert = "insert into calle values(0,'$descompone[1]')";
  68.             mysql_query($insert,$cn);
  69.             }
  70.  
  71. }
  72.  
  73. }
  74.  
  75.  
  76. function verificar($dato,$conexion)
  77. {
  78. $sql = "select codigo from calles_avenidas";
  79. $result = mysql_query($sql,$conexion);
  80. $contador=0;
  81. while($fila = mysql_fetch_object($result))
  82. {
  83.  if($dato==$fila->codigo)
  84.  {$contador++;}
  85. }
  86.  
  87. if($contador==0){return false;}
  88. else {return true;}
  89.  
  90. }

esta es para llamar a la función anterior...
cadenas.php
Código PHP:
Ver original
  1. include "mysql_coneccion.inc";
  2. include "funcion.php";
  3.  
  4. $cn = coneccion();
  5.  
  6. //$cadena  = "Av. Buenos aires N. 289 Mz. C Lt. 29 Dst. SJL";
  7. $sql = "SELECT * FROM nombrevia";
  8. $conc = mysql_query($sql,$cn);
  9.  
  10. while($con = mysql_fetch_assoc($conc))
  11. {
  12.   $cadena = $con['descripcion'].'<br>';
  13.  
  14. distribuir_direccion($cadena,$cn);//la cadena y la coneccion
  15.  echo $cadena;
  16.  
  17. }
antes se crean una base de datos ok...eso es facil.

si tienen una mejor me comparten ok...estamos en el foro..gracias

Saludos!!!

Etiquetas: tabla, algoritmos
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 22:29.