Foros del Web » Programando para Internet » PHP »

Ayuda con bucle

Estas en el tema de Ayuda con bucle en el foro de PHP en Foros del Web. Hola a todos , tengo el siguiente problema. resulta que tengo que hacer lo siguiente, cree un array para hacer que tire nombres al azar, ...
  #1 (permalink)  
Antiguo 04/10/2010, 14:01
 
Fecha de Ingreso: abril-2009
Mensajes: 409
Antigüedad: 15 años
Puntos: 3
Ayuda con bucle

Hola a todos , tengo el siguiente problema. resulta que tengo que hacer lo siguiente, cree un array para hacer que tire nombres al azar, el tema es que lo que tendria que hacer es que el resultado de ese nombre lo compare con una base de datos y si no esta que vuelva a generar otro nombre asi hasta que no este en la base de datos, lo que yo hice fue lo siguiente.

Código PHP:
$silabas = array("a","e","i","o","u","wa","we","wi","wo","wu","sa","se","si","so","su","za","ze","ax","ex","ca","ce","ci","co","cu","da","de","di","do","du","fa","fe","fi","fo","fu","ra","re","ri","ro","ru","va","ve","vi","vo","vu","ba","be","bi","bo","bu","na","ne","ni","no","nu","ma","me","mi","mo","mu","ha","he","hi","ho","hu","yo","ja","je","ji","jo","ju","la","le","li","lo","lu","pa","pe","pi","po","pu","al","el","tha","l","l","l","l","r","r","r","s","s","s","a","e","i","o","a","e","i","o");

$nombre="";

for (
$i=0;$i<=rand(2,4);$i++) {
    
$nombre=$nombre.$silabas[rand(0,124)];
}

//$nombre=strtoupper($nombre);
$nombre ucfirst($nombre);

$sql "SELECT nombre from publeje where nombre ='$nombre'";
$rs mysql_query($sql);
if (
mysql_num_rows($rs))
  {
for (
$i=0;$i<=rand(2,4);$i++) {
    
$nombre=$nombre.$silabas[rand(0,124)];
  }

$nombre=ucfirst($nombre);     
  }else{

$nombre=$nombre;
  }
echo 
$nombre
pero esta mal porque verifica una ves y si llegara a estar 2 veces no vuelve hacer el bucle for, como se puede hacer que haga un bucle hasta que el nombre no este en la base de datos?.

Saludos y muchas gracas
  #2 (permalink)  
Antiguo 04/10/2010, 14:14
Avatar de bLEx  
Fecha de Ingreso: mayo-2008
Ubicación: Villa Alemana, Chile
Mensajes: 181
Antigüedad: 15 años, 11 meses
Puntos: 5
Respuesta: Ayuda con bucle

Idea...

Código PHP:
<?
$encontrado 
false;
do
{
    
//armas nueva palabra
    
....$nombre = .....

    
//consultas por palabra
    
$sql "SELECT nombre from publeje where nombre ='$nombre'";
    
$rs mysql_query($sql); 

    if(
mysql_num_rows($rs)!=0){
        
$encontrado true;
    }
}
while(
$encontrado == false);

echo 
'Se ha encontrado el nombre: '.$nombre;
?>
Espero te sirva.
Saludos!
  #3 (permalink)  
Antiguo 04/10/2010, 14:16
Avatar de Nano_  
Fecha de Ingreso: febrero-2006
Ubicación: Bogotá, Colombia
Mensajes: 1.866
Antigüedad: 18 años, 2 meses
Puntos: 96
Respuesta: Ayuda con bucle

Saludos

Solo seria ajustar esta linea.

if (mysql_num_rows($rs)==0)

Hasta Pronto!.
__________________
:.:Nano.:: @nano_hard - Retornando al foro
  #4 (permalink)  
Antiguo 04/10/2010, 14:19
 
Fecha de Ingreso: diciembre-2007
Mensajes: 927
Antigüedad: 16 años, 4 meses
Puntos: 12
Respuesta: Ayuda con bucle

Hey esto puede causer error averse se necessity poner === para igualarlo a un false o true o simplemnte pongee un

If(!$){

}

Saludos

Cita:
Iniciado por bLEx Ver Mensaje
Idea...

Código PHP:
<?
$encontrado 
false;
do
{
    
//armas nueva palabra
    
....$nombre = .....

    
//consultas por palabra
    
$sql "SELECT nombre from publeje where nombre ='$nombre'";
    
$rs mysql_query($sql); 

    if(
mysql_num_rows($rs)!=0){
        
$encontrado true;
    }
}
while(
$encontrado == false);

echo 
'Se ha encontrado el nombre: '.$nombre;
?>
Espero te sirva.
Saludos!
  #5 (permalink)  
Antiguo 04/10/2010, 15:48
Avatar de eits  
Fecha de Ingreso: junio-2005
Ubicación: valladolid, yucatán
Mensajes: 1.655
Antigüedad: 18 años, 10 meses
Puntos: 88
Respuesta: Ayuda con bucle

Cita:
Iniciado por diegomel Ver Mensaje
cree un array para hacer que tire nombres al azar
me parece de mal gusto ajudicarse el trabajo de otro en este caso del amigo VUN, y por lo que veo no prestaste atención de lo que te dijo y ni tuviste la delicadesa de checarlo
Código PHP:
Ver original
  1. $nombre=$nombre.$silabas[rand(0,124)];
el 124 no va es 100 si te checas el array te daras cuenta.
__________________
El amor es la locura mas lucida que tiene el hombre.- Andres Henestrosa
la tristeza no existe, solo es... la ausencia de la felicidad.
  #6 (permalink)  
Antiguo 04/10/2010, 16:27
 
Fecha de Ingreso: abril-2009
Mensajes: 409
Antigüedad: 15 años
Puntos: 3
Respuesta: Ayuda con bucle

Si lo vi eso , pero no le di importancia porque lo estaba testeando, es una forma de decir lo cree, me lo pasaron en el foro este, yo le arme el tema de la consulta mysql para que haga la comprobacion y luego le tengo que agregar caracteres maximos y cantidad de palabras variables.

Disculpen no era la idea adjudicarme nada .


Saludos y gracias.
  #7 (permalink)  
Antiguo 04/10/2010, 17:24
Avatar de eits  
Fecha de Ingreso: junio-2005
Ubicación: valladolid, yucatán
Mensajes: 1.655
Antigüedad: 18 años, 10 meses
Puntos: 88
Respuesta: Ayuda con bucle

Código PHP:
Ver original
  1. function getNombre(){
  2.     $silabas = array("a","e","i",...); //aqui el array que tienes
  3.     $nombre="";
  4.     for ($i=0;$i<=rand(2,4);$i++) {
  5.         $nombre=$nombre.$silabas[rand(0,100)];
  6.     }
  7.     return ucfirst($nombre);
  8. }
  9. $band=false;
  10. do{
  11.     $nombre=getNombre();
  12.     $rs = mysql_query('SELECT nombre from publeje where nombre ="'.$nombre.'"') or die(mysql_error());
  13.     if (mysql_num_rows($rs) <= 0){$band=true;}
  14. }while($band);
  15. echo $nombre;
espero te ayude
__________________
El amor es la locura mas lucida que tiene el hombre.- Andres Henestrosa
la tristeza no existe, solo es... la ausencia de la felicidad.
  #8 (permalink)  
Antiguo 07/10/2010, 08:58
 
Fecha de Ingreso: abril-2009
Mensajes: 409
Antigüedad: 15 años
Puntos: 3
Respuesta: Ayuda con bucle

a ver si me pueden destrabar lo que me esta faltando que no puedo encontrar, en base a lo que se posteo aca yo arme una clase para sacar nombres aleatorios, ahora el problema que tengo es que en cuanto $i da true no para mas el bucle y se me va el apache al 100% durante 30 seg hasta que corta automaticamente,osea mientras sea false $i el bucle anda bien.
esta en la funcion de la clase que muetra y hace el buclu getnombre() genera el nombre aleatorio y lo que tengo yo limitado es que no pase de 20 letras, en cuanto se pasa de 20 letras se traba todo.
A ver si alguien me puede ayudar que es en lo que estoy fallando.

Saludos y gracias..


Código PHP:
// Muestra el nombre Final filtrado y revisado en base de datos //
    
public function MostrarNombre() {
        
$i true;
        do {
            
$this->nombre $this->getNombre();
            
$sql "SELECT nombre from publeje where nombre ='$this->nombre'";
            
$rs mysql_query ($sql);
            if (
mysql_num_rows($rs) == && (strlen($this->nombre) <= 20))
                
$i false;

        } while (
$i);
    
        return 
$this->nombre;
    } 
  #9 (permalink)  
Antiguo 07/10/2010, 09:26
Avatar de eits  
Fecha de Ingreso: junio-2005
Ubicación: valladolid, yucatán
Mensajes: 1.655
Antigüedad: 18 años, 10 meses
Puntos: 88
Respuesta: Ayuda con bucle

creo que esta parte
Código PHP:
Ver original
  1. strlen($this->nombre) <= 20
debes de compararlo en el método getNombre(), para que de esa forma siempre te devuelva un nombre menor a 20.
saludos
__________________
El amor es la locura mas lucida que tiene el hombre.- Andres Henestrosa
la tristeza no existe, solo es... la ausencia de la felicidad.
  #10 (permalink)  
Antiguo 07/10/2010, 09:37
 
Fecha de Ingreso: abril-2009
Mensajes: 409
Antigüedad: 15 años
Puntos: 3
Respuesta: Ayuda con bucle

el tema es que si esta el nombre en la base tambien se va el apache ,osea en cuanto no es false la primera vuelta del bucle se hace siempre true parece y no para mas.

no se que puede ser la verdad probe de todo. a ver si alguien detecta el error.

gracias de antemano.
  #11 (permalink)  
Antiguo 07/10/2010, 09:49
Avatar de eits  
Fecha de Ingreso: junio-2005
Ubicación: valladolid, yucatán
Mensajes: 1.655
Antigüedad: 18 años, 10 meses
Puntos: 88
Respuesta: Ayuda con bucle

insisto en lo que te dije antes, asegurate que desde el método que te devuelve el nombre siempre lo haga con nombres menores de 20 y depues en el método MostrarNombre() solo compara el resultado de la consulta
Código PHP:
Ver original
  1. if (mysql_num_rows($rs) >= 1)
fijate en esto ">= 1" es para asegurarnos que hay por lo menos un registro y con eso volvemos $i en false para que termine el ciclo.
__________________
El amor es la locura mas lucida que tiene el hombre.- Andres Henestrosa
la tristeza no existe, solo es... la ausencia de la felicidad.
  #12 (permalink)  
Antiguo 08/10/2010, 10:24
 
Fecha de Ingreso: abril-2009
Mensajes: 409
Antigüedad: 15 años
Puntos: 3
Respuesta: Ayuda con bucle

Buen,despues de luchar logre arreglar el problema y ajustar algunas cosas y aparetentemente anda todo bien. el problema era que yo estaba usando la misma variable para el textbox y para generar nombre entonces lo concatenaba cada ves que el bucle do while era mas de 1 entonces se pasaba de vueltas.

Para aquellos que les sirva ya que quedo bastante bien y para quien quiera modificarla, mejorarla etc, les dejo la clase que arme con cosas de este post para quien la necesite.

Código PHP:
class EjemplarNombre {
    
    
// Atributos //
    
private $nombre//Nombre generado
    
private $palabras//Cantidad de palabras a generar
    
private $cantidad// Cantidad de letras del nombre generado
    
private $texto// Texto del textbox //
    
    
    ////////////////   Metodos   ////////////////
    // Constructor //
    
function __construct($palabras=1,$texto=NULL) {
    
$this->palabras $palabras;
    
$this->texto $texto;
    }

    
    
// Obtiene un nombre aleatorio combinando las silabas //
    
private function getNombre() {
        
$silabas = array ("a""e""i""o""u""wa""we""wi""wo""wu""sa""se""si""so""su""za""ze""ax""ex""ca""ce""ci""co""cu""da""de""di""do""du""fa""fe""fi""fo""fu""ra""re""ri""ro""ru""va""ve""vi""vo""vu""ba""be""bi""bo""bu""na""ne""ni""no""nu""ma""me""mi""mo""mu""ha""he""hi""ho""hu""yo""ja""je""ji""jo""ju""la""le""li""lo""lu""pa""pe""pi""po""pu""al""el""tha""l""l""l""l""r""r""r""s""s""s""a""e""i""o""a""e""i""o");
            
        
$var = ($this->palabras ) ? 4//para mas de 3 palabras se busca entra 2 y 3    
        
for($j 1$j <= $this->palabras$j ++) {
            if (
$j ==1// a la primera palabra se agrega el textbox $this->texto //
            
$this->nombre $this->texto;
            for(
$i 0$i <= rand (2,$var); $i ++) {
            
$this->nombre $this->nombre.$silabas [rand (0100)];
            }
            if (
$this->palabras 1// Mas de 1 palabra agrego espacio entre palabras //
            
$this->nombre $this->nombre." ";
        }
        return 
$this->nombre;
    }

    
    
// Muestra el nombre Final filtrado y revisado en base de datos hasta 20 caracteres//
    
public function MostrarNombre() {
        
$i true;
        do {
               
$this->nombre $this->getNombre();
            
$sql "SELECT nombre from publeje where nombre ='$this->nombre'";
            
$rs mysql_query ($sql);
            if (
mysql_num_rows($rs) == && strlen($this->nombre)<21)
                
$i false;
            
        } while (
$i);
    
        return 
$this->nombre;
    }
    
    
    
// Cantidad de Letras Mostradas //
    
public function CantidadLetras(){
        
$this->cantidad strlen($this->nombre);
        return 
$this->cantidad;
    }
    

para usarla es facil.

Código PHP:
$a = new EjemplarNombre(2,"Diego"); //variables opcionales, 1era cantidad de paginas / 2da texto al comienzo.
echo "Nombre Generado: ".$a->MostrarNombre();
echo 
"Cantidad de Caracteres: ".$a->CantidadLetras(); 
en la clase esta limitado a 20 letras maximo, eso lo pueden poner variable o sacarlo directamente.

Buen espero que le sirva a alguien y o puedan mejorarla.

Saludos y gracias a todos por la ayuda..
  #13 (permalink)  
Antiguo 08/10/2010, 22:38
Avatar de eits  
Fecha de Ingreso: junio-2005
Ubicación: valladolid, yucatán
Mensajes: 1.655
Antigüedad: 18 años, 10 meses
Puntos: 88
Respuesta: Ayuda con bucle

le hice unos cambios para reducir la posibilidad de que se demore pero todavia le falta
Código PHP:
Ver original
  1. class EjemplarNombre {
  2.  
  3.     // Atributos //
  4.  
  5.     private $nombre; //Nombre generado
  6.  
  7.     private $palabras; //Cantidad de palabras a generar
  8.  
  9.     //private $cantidad; // Cantidad de letras del nombre generado (no se necesita)
  10.  
  11.     ////////////////   Metodos   ////////////////
  12.  
  13.     // Constructor //
  14.  
  15.     function __construct($palabras=1,$texto='') {
  16.  
  17.         $this->palabras = $palabras;
  18.  
  19.         $this->nombre = $texto;
  20.  
  21.     }
  22.  
  23.     // Obtiene un nombre aleatorio combinando las silabas //
  24.  
  25.     private function getNombre() {
  26.  
  27.         $silabas = array ("a", "e", "i", "o", "u", "wa", "we", "wi", "wo", "wu", "sa", "se", "si", "so", "su", "za", "ze", "ax", "ex", "ca", "ce", "ci", "co", "cu", "da", "de", "di", "do", "du", "fa", "fe", "fi", "fo", "fu", "ra", "re", "ri", "ro", "ru", "va", "ve", "vi", "vo", "vu", "ba", "be", "bi", "bo", "bu", "na", "ne", "ni", "no", "nu", "ma", "me", "mi", "mo", "mu", "ha", "he", "hi", "ho", "hu", "yo", "ja", "je", "ji", "jo", "ju", "la", "le", "li", "lo", "lu", "pa", "pe", "pi", "po", "pu", "al", "el", "tha", "l", "l", "l", "l", "r", "r", "r", "s", "s", "s", "a", "e", "i", "o", "a", "e", "i", "o");
  28.  
  29.         $var = ($this->palabras > 3 ) ? 2 : 4; //para mas de 3 palabras se busca entr2 2 y 3
  30.  
  31.         for($j = 1; $j <= $this->palabras; $j ++) {
  32.  
  33.             $vueltas = rand (2,$var);
  34.  
  35.             for($i = 1; $i <= $vueltas; $i ++) {
  36.  
  37.                 $this->nombre .= $silabas[rand (0, 100)];
  38.  
  39.             }
  40.  
  41.             if ($this->palabras > 1) // Mas de 1 palabra agrego espacio //
  42.  
  43.             $this->nombre .= " ";
  44.  
  45.         }
  46.  
  47.         $this->nombre;
  48.  
  49.     }
  50.  
  51.     // Muestra el nombre Final filtrado y revisado en base de datos hasta 20 caracteres//
  52.  
  53.     public function MostrarNombre() {
  54.  
  55.         $i = true;
  56.  
  57.         while($i){
  58.  
  59.             $this->getNombre();
  60.  
  61.             $rs = mysql_query ('SELECT nombre from publeje where nombre ="'.$this->nombre.'"');
  62.  
  63.             if (mysql_num_rows($rs) == 0 && $this->CantidadLetras() < 21) //
  64.  
  65.                 $i = false;
  66.  
  67.         }
  68.  
  69.         return $this->nombre;
  70.  
  71.     }
  72.  
  73.     // Cantidad de Letras Mostradas //
  74.  
  75.     public function CantidadLetras(){
  76.  
  77.        return strlen($this->nombre);
  78.  
  79.     }
  80.  
  81.      
  82.  
  83. }
saludos.
__________________
El amor es la locura mas lucida que tiene el hombre.- Andres Henestrosa
la tristeza no existe, solo es... la ausencia de la felicidad.

Última edición por eits; 10/10/2010 a las 22:38

Etiquetas: bucle
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 21:45.