Foros del Web » Programando para Internet » PHP »

Consulta + Array + Arbol de Categorias

Estas en el tema de Consulta + Array + Arbol de Categorias en el foro de PHP en Foros del Web. Hola chicos, estoy armando una arbol de categorias, pero me he quedado trabado, en como hacer para recorrer un array, y asi armar cierta informacion ...
  #1 (permalink)  
Antiguo 16/09/2008, 21:44
 
Fecha de Ingreso: mayo-2005
Mensajes: 257
Antigüedad: 18 años, 11 meses
Puntos: 1
Consulta + Array + Arbol de Categorias

Hola chicos, estoy armando una arbol de categorias, pero me he quedado trabado, en como hacer para recorrer un array, y asi armar cierta informacion que necesito.

Por ahora, lo que pude lograr, fue armar un array, el cual, los numeros indican el ID de la categoria, y el Parent del mismo.

Mi array contiene lo siguiente:

Código PHP:

Array
(
    [
1] => Array
        (
            [
4] => Aventura
        
)

    [
0] => Array
        (
            [
3] => Celulares
            
[1] => LIbros
            
[2] => Zapatos
        
)

    [
4] => Array
        (
            [
5] => Infantil
        
)


Lo que no puedo lograr, es por ejemplo, quiero armar en texto, la ruta de la categoria Infantil, cuyo ID del array es el numero 5. Nose como hacerlo, se que es a traves de un ciclo o varios ciclos anidados, pero no me sale.

El resultado de la ruta, seria la siguiente:

Libros (ID = 1, Parent = 0) --> Aventura(ID=4, Parent = 1) --> Infantil (ID=5, Parent=4)


Algun ayudita?

Muchas Gracias
  #2 (permalink)  
Antiguo 16/09/2008, 23:42
Avatar de radarcba  
Fecha de Ingreso: mayo-2005
Ubicación: ureleando
Mensajes: 505
Antigüedad: 18 años, 11 meses
Puntos: 3
Respuesta: Consulta + Array + Arbol de Categorias

No logro entender el criterio que utilizas para la ruta que indicas:
Libros (ID = 1, Parent = 0) --> Aventura(ID=4, Parent = 1) --> Infantil (ID=5, Parent=4)

Ni como seleccionarias cada ID y cada Parent.
__________________
Maldición va a ser un día hermoso... PR
Tetris, correo & TU IP
  #3 (permalink)  
Antiguo 17/09/2008, 01:01
 
Fecha de Ingreso: mayo-2005
Mensajes: 257
Antigüedad: 18 años, 11 meses
Puntos: 1
Respuesta: Consulta + Array + Arbol de Categorias

Toda esta info la obtengo de una base de datos.

La idea es, por ejemplo, yo quiero la ruta de "Infantil".
Infantil tiene la ID = 5, su parent es el 4

Código PHP:
   [4] => Array
        (
            [
5] => Infantil
        

Luego debo buscar, que categoria tiene ID = 4 y cual es el Padre de esta,
esa info esta en:

Código PHP:
 [1] => Array
        (
            [
4] => Aventura
        

Luego hago lo mismo, pero busco la Categoria que tiene ID = 1 y esta esta en

Código PHP:
    [0] => Array
        (
            [
3] => Celulares
            
[1] => LIbros
            
[2] => Zapatos
        

Y como la categoria tiene Parent = 0, deberia terminar el bucle.

Se que tambien se puede o se debe, hacer con una funcion recursiva. Pero no me esta saliendo.

espero que me haya explicado mejor.
  #4 (permalink)  
Antiguo 17/09/2008, 13:48
 
Fecha de Ingreso: septiembre-2008
Mensajes: 19
Antigüedad: 15 años, 7 meses
Puntos: 5
Respuesta: Consulta + Array + Arbol de Categorias

Hola,
Storing Hierarchical Data in a Database
http://www.sitepoint.com/article/hierarchical-data-database/2/

La URL anterior describe como como almacenar datos jerárquicamente en una base de datos, así como recorrer en "preorden" el árbol para mostrarlo, añadir un nodo al árbol, etc....

Respecto a mostrar la ruta jeráquicamente, la función que describe permite pasar a dicha función el nodo raíz del subárbol que se mostrará.

...un ejemplo:

Código PHP:
--
-- 
Estructura de tabla para la tabla `categorias`
--

CREATE TABLE IF NOT EXISTS `categorias` (
  `
idint(11NOT NULL auto_increment,
  `
nombrevarchar(30NOT NULL default '',
  `
padreint(11) default NULL,
  `
izqint(11NOT NULL default '0',
  `
derint(11NOT NULL default '0',
  
PRIMARY KEY  (`id`)
ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=14 ;

--
-- 
Volcar la base de datos para la tabla `categorias`
--

INSERT INTO `categorias` (`id`, `nombre`, `padre`, `izq`, `der`) VALUES
(1'Tienda'NULL112),
(
2'Libros'127),
(
3'Aventura'236),
(
4'Infantil'345),
(
5'Zapatos'189),
(
6'Celulares'11011); 
Código PHP:
<?php  
//--CONEXIÓN-------------------------------------------------------
$dblink mysql_connect('servidor','usuario','clave');
mysql_select_db('tienda');
//-----------------------------------------------------------------
function recorrer_arbol($raiz){  
    
$resultmysql_query("SELECT izq,der FROM categorias WHERE id=$raiz");  
    
$fila=mysql_fetch_array($result);  
    
$derecha=array();  
    
$result=mysql_query("SELECT * FROM categorias WHERE izq BETWEEN ".
    
$fila["izq"]." AND ".$fila["der"]." ORDER BY izq ASC");  
    while (
$fila=mysql_fetch_array($result)){  
        
extract($fila);  
        if (
count($derecha)>0){  
          while (
$derecha[count($derecha)-1]<$fila["izq"]){array_pop($derecha);}  
        }  
        echo 
str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;',count($derecha))."<a href='".
        
$_SERVER['PHP_SELF']."?id=$id'>$nombre</a><br>\n";  
        
$derecha[]=$fila["der"];  
   }  
}  
recorrer_arbol(1);
?>
Resultado:

Tienda
Libros
Aventura
Infantil
Zapatos
Celulares


Para mostrar una rama se pasa el nodo raíz de esta, por ej: recorrer_arbol(2);

Libros
Aventura
Infantil


--->Juan Bautista Cascallar Lorenzo<---
  #5 (permalink)  
Antiguo 17/09/2008, 16:20
 
Fecha de Ingreso: mayo-2005
Mensajes: 257
Antigüedad: 18 años, 11 meses
Puntos: 1
Respuesta: Consulta + Array + Arbol de Categorias

Gracias por la info, es muy util, yo lo que intentaba era modificar un script en el cual, en ves de usar usa basa de datos con campos, de IZQUIERDA Y DERECHA, solo utilizaba el campo de Parent es decir mi tabla seria asi:

Código PHP:
ID_Categoria Nombre Parent 
Me parecio muy bueno, porque solo hacia un llamado a la base de datos, y en forma recursiva desglosaba el array devuelto.

Que opinas? es Mejor el Método que me has enviado o el que yo te comento??

Un abrazo.
  #6 (permalink)  
Antiguo 18/09/2008, 01:45
Avatar de Lord of freaks  
Fecha de Ingreso: octubre-2004
Ubicación: Madrid
Mensajes: 334
Antigüedad: 19 años, 6 meses
Puntos: 2
Respuesta: Consulta + Array + Arbol de Categorias

Hola

El resultado no es exactamente como tu pedías pero creo que mejora y que el array que devuelve es bastante más sencillo de parsear para hacer un menú o un breadcrum que creo que es lo que buscar:

Código:
<?php
$categorias = array (1 => array (4 => 'Aventura' ), 

0 => array (3 => 'Celulares', 1 => 'LIbros', 2 => 'Zapatos' ), 

4 => array (5 => 'Infantil' ) 
);

function &array_find_element_by_key($key, &$tree) {
  if (array_key_exists($key, $tree)) {
    $ret =& $tree[$key];
    return $ret;
  }
  foreach ($tree as $k => $v) {
    if (is_array($v)) {
      $ret =& array_find_element_by_key($key, $tree[$k]);
      if ($ret) {
        return $ret;
      }
    }
  }
  return FALSE;
}

function set_element_by_key($key,&$tree,$val){
	if (array_key_exists($key, $tree)) {
		$tree[$key]['childrens'] = $val;
		ksort($tree[$key]['childrens']);
	    return true;
	  }
	 foreach ($tree as $k => $v) {
	    if (is_array($v)) {
	      $ret = set_element_by_key($key, $tree[$k],$val);
	      if ($ret) {
	        return true;
      	}
    }
  }
  return FALSE;
}

function formatValue($val){
	$return = array();
	foreach ($val as $k => $v) $return[$k] = array('title' => $v,'childrens' => array());
	return $return;
}

$tree = array();
function getTree($categorias,$parent = 0){
	global $tree;
	if($parent === 0) {
		$tree = array('title' => 'home','childrens' => array());
		foreach($categorias[0] as $k => $v){
			$tree['childrens'][$k] = array('title' => $v,'childrens' => array());
			ksort($tree['childrens']);
		}
		unset($categorias[0]);	
	}
	
	foreach ($categorias as $key => $childrens){
			
			if ($newval = array_find_element_by_key($key, $tree)){
				set_element_by_key($key,$tree,formatValue($childrens));
			}
			$parent = $key;
		}
	
	return $tree;
}
echo "<pre>";
print_r(getTree($categorias));
echo "</pre>";
?>
__________________
Una vez un elemental de rayos mató una tribu entera de tritones.

¡¡ El sólo quería darse un baño !!

http://www.frikilandia.com

Neither Fu Nor Fa

Última edición por Lord of freaks; 18/09/2008 a las 03:37 Razón: Ahora devuelve los arrays "children" ordenados por key para hacerlo más jerárquico
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 05:06.