Foros del Web » Programando para Internet » PHP »

recursivo

Estas en el tema de recursivo en el foro de PHP en Foros del Web. Hola, es mi primera intervención en el foro. Tengo este script para revisar cuales son las subcategorías de una categoría /*function recursive($pariente) { $sql = ...
  #1 (permalink)  
Antiguo 09/09/2012, 11:05
 
Fecha de Ingreso: septiembre-2012
Ubicación: Lugo
Mensajes: 31
Antigüedad: 11 años, 7 meses
Puntos: 0
recursivo

Hola, es mi primera intervención en el foro.

Tengo este script para revisar cuales son las subcategorías de una categoría

/*function recursive($pariente)
{
$sql = mysql_query("SELECT * FROM Familia WHERE IdPadre = '$pariente' ") or die(mysql_error());
while( $Hijo = mysql_fetch_array($sql) )
{
echo "" .$Hijo['nombre']. "<br>";
recursive_hijos($Hijo['Id']);
}
}*/

Lo único que quiero es que en vez de verlo en pantalla con el echo, poder almacenar en una variable o en un array el resultado de $Hijo['nombre']

Lo que parece super sencillo no lo consigo, por ejemplo intento:

$arbol = array();
$select="";
function recursive($pariente)
{
// $sql = mysql_query("SELECT * FROM Familia WHERE IdPadre = '$pariente' ") or die(mysql_error());
$sql = mysql_query("select * from familias where dependede='$pariente' and codfamilia<>dependede") or die(mysql_error());
while( $Hijo = mysql_fetch_array($sql) )
{

//echo "" .$Hijo['nombre']. "<br>";
$aver=$Hijo["codfamilia"];
$select.=$aver;
//$arbol[] = $aver;
recursive($Hijo['codfamilia']);
}

}

recursive(4);


echo("select $select");

y el resultado no es nada, si hiciera print_r($arbol) tampoco me almacena nada.
Hago algo mal en el código?. Gracias

El motivo de intentar almacenar en un array o variable los id de todas las subcategorías de una categoría es poder calcular el subtotal de esa categoría sumando las facturas de artículos que dependan de ella o de alguna que dependa de ella.

Gracias de todas formas
  #2 (permalink)  
Antiguo 09/09/2012, 13:52
 
Fecha de Ingreso: mayo-2006
Mensajes: 475
Antigüedad: 18 años
Puntos: 58
Respuesta: recursivo

Hola no se que hace la funcion recursive_hijos... pero la otra debería funcionar con esto:
Código PHP:
Ver original
  1. <?php
  2. function recursive($pariente){
  3. $conexion = mysql_pconnect('localhost', 'user', 'pass');
  4. mysql_select_db('nombre base de datos',$conexion);
  5. $arbol = array();
  6. $sql = mysql_query("SELECT * FROM Familia WHERE IdPadre = '$pariente' ") or die(mysql_error());
  7.     while( $Hijo = mysql_fetch_array($sql)){
  8.         $arbol[]=$Hijo['nombre'];
  9.         recursive_hijos($Hijo['Id']);//esto no se que hace :)
  10.     }
  11.     return $arbol;
  12. }
  13. $resultado=recursive(4);
  14. print_r($resultado);
  15. ?>
  #3 (permalink)  
Antiguo 10/09/2012, 03:58
 
Fecha de Ingreso: septiembre-2012
Ubicación: Lugo
Mensajes: 31
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: recursivo

Gracias por la respuesta:

recursive_hijos debería poner recursive, es decir vuelve a llamar a la misma función para sacar las subcategorías existentes.
Se me había olvidado poner el return y por eso no salía.

Efectivamente me sale en pantalla el print_r pero no me salen los nombres de las subcategorías.
Es decir , si pongo un echo antes de almacenar en el array arbol
echo "" .$Hijo['nombre']. "<br>";
$arbol[]=$Hijo['nombre']; //$arbol[] = $aver;
En el echo sí que me salen todas las subcategorías pero en el print_r no. Concretamente:
101 CONCENTRADOS
1010 CONCENTRADOS VACAS LECHERAS
102 MEZCLAS
103 FORRAJES
104 OTROS ALIM
Array ( [0] => 101 CONCENTRADOS [1] => 102 MEZCLAS [2] => 103 FORRAJES [3] => 104 OTROS ALIM )

He intentado de muchas maneras pero siempre se salta las subcategorías. A mí me interesa tener un array unidimensional de todas las categorías y subcategorías que penden de una en concreto para poder calcular la suma de gastos totales de artículos que pertenezcan a ellas.

Alguna idea?
  #4 (permalink)  
Antiguo 10/09/2012, 04:01
 
Fecha de Ingreso: septiembre-2012
Ubicación: Lugo
Mensajes: 31
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: recursivo

También he probado a almacenarlo en una variable normal en vez de en un array con:

$select.= $Hijo['nombre'];//echo("$select n$n<BR>");

pero también me concatena todo menos las subcategorías

101 CONCENTRADOS102 MEZCLAS103 FORRAJES104 OTROS ALIM
  #5 (permalink)  
Antiguo 10/09/2012, 13:21
 
Fecha de Ingreso: mayo-2006
Mensajes: 475
Antigüedad: 18 años
Puntos: 58
Respuesta: recursivo

es que la verdad no me hago a la idea de como es la estructura de las tablas... :)
  #6 (permalink)  
Antiguo 10/09/2012, 14:11
 
Fecha de Ingreso: septiembre-2012
Ubicación: Lugo
Mensajes: 31
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: recursivo

En realidad mi tabla es:
-codfamilia
-nombre
-dependede
En el ejemplo del script la tabla sería:
-id
-nombre
-IdPadre
Son campos similares como ves, el primero representa el id de la familia, el segundo el nombre de la familia y el tercero el id del que depende (la familia de la que es subfamilia)
  #7 (permalink)  
Antiguo 10/09/2012, 14:24
 
Fecha de Ingreso: mayo-2006
Mensajes: 475
Antigüedad: 18 años
Puntos: 58
Respuesta: recursivo

Es que tienes las familias y las subfamilias en la misma tabla?
  #8 (permalink)  
Antiguo 10/09/2012, 14:27
 
Fecha de Ingreso: septiembre-2012
Ubicación: Lugo
Mensajes: 31
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: recursivo

sí, exactamente
En la mayoría de los ejemplos que he visto lo hacen así:

id
familia
padre
  #9 (permalink)  
Antiguo 10/09/2012, 14:29
 
Fecha de Ingreso: septiembre-2012
Ubicación: Lugo
Mensajes: 31
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: recursivo

de todas formas aunque estuvieran en diferentes tablas el script supongo que fallaría igual.
Tienes idea de porqué puede fallar. Es como si cuando al hacer el while de la última subcategoría lo desecha porque el select no devuelve resultados. Quizás tendría que poner una condición de si el número de resultados es >0 que vuelva a la función y si no no
  #10 (permalink)  
Antiguo 10/09/2012, 16:02
 
Fecha de Ingreso: mayo-2006
Mensajes: 475
Antigüedad: 18 años
Puntos: 58
Respuesta: recursivo

Si lo haces así, te va a devolver un array con todos:
Código PHP:
Ver original
  1. <?php
  2. function recursive($pariente){
  3. $conexion = mysql_pconnect('localhost', 'user', 'pass');
  4. mysql_select_db('nombre base de datos',$conexion);
  5. $arbol = array();
  6. $sql = mysql_query("SELECT * FROM Familia WHERE IdPadre = '$pariente' ") or die(mysql_error());
  7.     while( $Hijo = mysql_fetch_array($sql)){
  8.         $arbol[$Hijo['nombre']][]=$Hijo['id'];
  9.     }
  10.     return $arbol;
  11. }
  12. $resultado=recursive(4);
  13. print_r($resultado);
  14. ?>
Prueba haber si es lo que necesitas
  #11 (permalink)  
Antiguo 10/09/2012, 16:17
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: recursivo

No es necesario hacer una función recursiva y, mucho menos, tener ahí mismo el código para conectar a la base de datos.

A ver si puedes adaptar el ejemplo de: http://www.forosdelweb.com/f18/agrup...1/#post2757607
__________________
- León, Guanajuato
- GV-Foto
  #12 (permalink)  
Antiguo 11/09/2012, 03:26
 
Fecha de Ingreso: septiembre-2012
Ubicación: Lugo
Mensajes: 31
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: recursivo

En el ejemplo que me das me lista las categorías padre, no las hijo.
Voy a ver el enlace que me pones y os cuento.
Muchas gracias.

Etiquetas: mysql, recursivo, sql, variables
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 12:50.