Foros del Web » Programando para Internet » PHP »

PHP OO Salir de funcion recursiva

Estas en el tema de Salir de funcion recursiva en el foro de PHP en Foros del Web. Estimados todos, tengo la siguiente función recursiva: function recorro($matriz, $directorioPadre) { foreach ($matriz as $key => $value) { if (is_object($value)) { $nombre = $value->getNombre(); if ...
  #1 (permalink)  
Antiguo 27/05/2012, 20:57
 
Fecha de Ingreso: octubre-2007
Mensajes: 29
Antigüedad: 17 años, 2 meses
Puntos: 0
Sonrisa Salir de funcion recursiva

Estimados todos, tengo la siguiente función recursiva:

function recorro($matriz, $directorioPadre)
{

foreach ($matriz as $key => $value) {

if (is_object($value)) {
$nombre = $value->getNombre();
if ($nombre == $directorioPadre) {
$encontro = TRUE;
$a['encontro'] = $encontro;
$a['tipoElemento'] = $value->getTipoElemento();
$a['key'] = $key;
$a['arreglo'] = $value;
$continuar = FALSE;
return $a; //retorna el objeto
} else {
$tipoObjeto = get_class($value);
if ($tipoObjeto == 'Directorio') {
//tiene subdirectorios
$listaElementos = $value->getListaElementos();
$numElementos = count($listaElementos);
if ($numElementos > 0) {
//si tiene elementos lo debe recorrer
$this->recorro($listaElementos, $directorioPadre);
}
}
}
} elseif (is_array($value)) {
//si es un array sigo recorriendo
recorro($value);
} else {
//si es un elemento lo muestro
$a = 'key:' . $value;
echo $a;
echo '<br>';
}
}

}

la idea de esta funcion es que recorra un array compuesto de objetos y me retorne el que coincida con cierto nombre, pero el problema es que llega a un nivel en que encuentra el nombre pero por la recursividad se sigue ejecutando, no se como resolverlo. Es decir deseo que una vez que haga el "return $a" se salga y no ejecute más.
  #2 (permalink)  
Antiguo 27/05/2012, 22:06
Avatar de JairLizcano  
Fecha de Ingreso: junio-2008
Ubicación: Santander, Colombia
Mensajes: 608
Antigüedad: 16 años, 6 meses
Puntos: 53
Respuesta: Salir de funcion recursiva

Es evidente que la función recursiva debe finalizar al retornar la variable $a, ahora mi pregunta es si la condición bajo los parámetros que indicas se cumple.

¿Has probado con valores que satisfagan la condición?

Buena suerte.
__________________
Programar dejó de ser una profesión acusada en la oscuridad y disfrutada fríamente... para convertirse en un arte.
  #3 (permalink)  
Antiguo 27/05/2012, 22:55
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 4 meses
Puntos: 2237
Respuesta: Salir de funcion recursiva

El uso de una variable estática podría servir.
__________________
- León, Guanajuato
- GV-Foto
  #4 (permalink)  
Antiguo 27/05/2012, 23:04
Avatar de rigobcastro  
Fecha de Ingreso: febrero-2012
Ubicación: Lejanías
Mensajes: 69
Antigüedad: 12 años, 9 meses
Puntos: 21
Respuesta: Salir de funcion recursiva

Bueno, yo comprobaria primero el tipo de variable luego ejecuto el bucle, tambien si necesito recorrer un objeto, me aseguro de que asi sea.

Haria algo así pero pues como dice JairLizcano necesitas saber que valores son y claro, el resto de codigo para ver si se puede simplificar..

Código PHP:
Ver original
  1. function recorro($matriz, $directorioPadre) {
  2.  
  3.     // Comprobamos si es una matriz u objecto para ejecutar el bucle de recorrido, si no imprime
  4.     if (is_object($matriz) OR is_array($matriz)) {
  5.         // Aseguramos de que la matriz se convierta a objeto
  6.         $matriz = (object) $matriz;
  7.        
  8.         // Recorremos con la seguridad de que es un objecto lo que vamos a recorrer    
  9.         foreach ($matriz as $key => $value) {
  10.             $nombre = $value->getNombre();
  11.             if ($nombre == $directorioPadre) {
  12.                 $encontro = TRUE;
  13.                 $a['encontro'] = $encontro;
  14.                 $a['tipoElemento'] = $value->getTipoElemento();
  15.                 $a['key'] = $key;
  16.                 $a['arreglo'] = $value;
  17.                 $continuar = FALSE;
  18.                 return $a; //retorna el objeto
  19.             } else {
  20.                 $tipoObjeto = get_class($value);
  21.                 if ($tipoObjeto == 'Directorio') {
  22.                     //tiene subdirectorios
  23.                     $listaElementos = $value->getListaElementos();
  24.                     $numElementos = count($listaElementos);
  25.                     if ($numElementos > 0) {
  26.                         //si tiene elementos lo debe recorrer
  27.                         $this->recorro($listaElementos, $directorioPadre);
  28.                     }
  29.                 }
  30.             }
  31.         }
  32.     } else {
  33.         $a = 'key:' . $value;
  34.         echo $a;
  35.         echo '<br>';
  36.     }
  37. }

!Claro! es solo como yo lo haria en cuestion a estructura, desconocemos su funcionalidad.

Saludos...
  #5 (permalink)  
Antiguo 28/05/2012, 05:19
Avatar de JairLizcano  
Fecha de Ingreso: junio-2008
Ubicación: Santander, Colombia
Mensajes: 608
Antigüedad: 16 años, 6 meses
Puntos: 53
Exclamación Respuesta: Salir de funcion recursiva

Me gustaría que revisarás esta clase, es de mi autoría, así te haces otras ideas de recursividad:

Código PHP:
<?php
    
class Recursivity {

        const 
BASIC 0;
        const 
POW 1;

        private 
$base;
        private 
$limit;

        private 
$serie;

        public function 
__construct() {

            
$this->base NULL;

            
$this->limit NULL;

            
$this->serie = new ArrayObject();
        }

        public function 
toFibonacci($integer) {

            
$result $integer $this->base;

            if(
$result $this->limit) {

                return 
$this->serie;
            } else {

                
$this->setBase($integer);

                
$this->serie->append($result);

                return (
$this->toFibonacci($result)) ? $this->serie FALSE;
            }
        }

        public function 
toPlus($integer$mode self::BASIC$level NULL) {

            
$result $integer;

            if(
$mode == self::BASIC) {

                if(
$result >= $this->limit) {

                    return 
$this->serie;
                } else {

                    
$this->serie->append($result);

                    return (
$this->toPlus($result 1)) ? $this->serie FALSE;
                }

            } elseif (
$mode == self::POW) {

                if(!(empty(
$level))) {

                    if(
pow($result$level) >= $this->limit) {

                        return 
$this->serie;
                    } else {

                        
$this->serie->append(pow($result$level));

                        return (
$this->toPlus($result 1self::POW$level)) ? $this->serie FALSE;
                    }
                }
            }
        }

        public function 
getBase() {

            return 
$this->base;
        }

        public function 
setBase($base) {

            
$this->base $base;

            return 
$this;
        }

        public function 
getLimit() {

            return 
$this->limit;
        }

        public function 
setLimit($limit) {

            
$this->limit $limit;

            return 
$this;
        }
    }
?>
Más que todo la función toFibonacci() (al igual que toPlus(), pero es más legible toFibonacci()):

Código PHP:
 public function toFibonacci($integer) { 

            
$result $integer $this->base

            if(
$result $this->limit) { 

                return 
$this->serie// Finaliza la serie de Fibonacci retornando el vector con dichos valores 
            
} else { 

                
$this->setBase($integer); 

                
$this->serie->append($result); 

                return (
$this->toFibonacci($result)) ? $this->serie FALSE;  // Retorno recursivo
            

        } 
Fue un ejercicio algo a falta de tiempo en clase, así que si necesitas documentación con respecto a ella, sólo me dices. Si te interesa.

Buena suerte.
__________________
Programar dejó de ser una profesión acusada en la oscuridad y disfrutada fríamente... para convertirse en un arte.

Etiquetas: funcion, recursiva, salir
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 20:09.