FAQ
Llevo un rato dandole vueltas y creo que me he saturado... seguro que es una tontada, pero ahora mismo soy incapaz de verlo...

Tengo el siguiente problema:

He de generar una lista dinamicamente a partir de consultas a una base de datos que no corresponden a las mismas tablas. Cada nodo de la lista se puede expandir a su vez de igual forma que su "padre"

Hasta ahi todo bien... problema... uso una funcion recursiva para hacerlo y trabajo con dos arrays, uno temporal donde hago las inserciones parciales y ordeno y uno global que es donde se genera la lista absoluta ordenada. Pues bien, cuando empiezo a expandir los nodos "hijo" en la tercera iteración me desaparece el array global... no se donde van a parar las inserciones (su count no incrementa)... lo he intentado via superglobals (array $GLOBALS), por referencias (pasando a cada iteracion una referencia del array global...) y nada... ningún resultado...

Alguna idea de donde puede estar el problema?

código de la funcion recursiva (no hagais mucho caso al codigo de bd, que esta encapsulado en una clase...
====================================================
$cn = Array() ;
$prods = Array() ;

expand ($famid,8) ;

function expand($id,$tipo) {
global $cn ;
global $prods
$ct = 4 ;
$cont = 0 ;
$tprods = Array() ;
switch ($tipo) {
case 8:
$tbl = "tbl_divisiones" ;
break ;
case 4:
$tbl = "tbl_grupos" ;
break ;
case 2:
$tbl = "tbl_series" ;
break ;
case 1:
$tbl = "tbl_productos" ;
break ;
}
// Select para el nodo actual
$sql = "select * from " . $tbl . " where id=" . $id ;
$rs = new mysql_recordset("conn",$sql) ;
$rs->query() ;
$rs->movenext() ;
$cnn = "" ;
for ($i = 0 ; $i<count($cn)-1 ; $i++) {
if ($i>0) $cnn .= "," ;
$cnn .= $cn[$i] ;
}
// Añadimos el nodo a la lista, al final haremos la insercion de longitudes
echo "DEBUG: Inserting " . $tipo . "#" . $rs->value("id") . "#" . $cnn . "#" .$rs->value("nombre_es") . "<br>" ;
$prods += Array($rs->value("orden")=>$tipo . "#" . $rs->value("id") . "#" . $cnn . "#" .$rs->value("nombre_es")) ;
// Expandimos el nodo... para ello vamos insertando todo lo que viene detras en $prods
while ($ct>=1) {
switch ($ct) {
case 4: // Lineas - Hacer select de lineas y añadir los nodos
$sql = "SELECT tbl_vademecum.*,tbl_grupos.nombre_es from tbl_vademecum,tbl_grupos where tbl_grupos.id=tbl_vademecum.contenido and tbl_vademecum.tipo_contenido=4 and tbl_vademecum.tipo_contenedor=" . $tipo . " and tbl_vademecum.contenedor=" . $id ;
break ;
case 2: // Serie
$sql = "SELECT tbl_vademecum.*,tbl_series.nombre_es from tbl_vademecum,tbl_series where tbl_series.id=tbl_vademecum.contenido and tbl_vademecum.tipo_contenido=2 and tbl_vademecum.tipo_contenedor=" . $tipo . " and tbl_vademecum.contenedor=" . $id ;
break ;
case 1: // Producto
$sql = "SELECT tbl_vademecum.*,tbl_productos.nombre_es from tbl_vademecum,tbl_productos where tbl_productos.id=tbl_vademecum.contenido and tbl_vademecum.tipo_contenido=1 and tbl_vademecum.tipo_contenedor=" . $tipo . " and tbl_vademecum.contenedor=" . $id ;
break ;
}
$rs->clear_recordset() ;
$rs->sqlstring = $sql ;
$rs->query() ;
while (!$rs->movenext()) {
$k = $rs->value("orden") ;
$d = $ct . "#" . $rs->value("contenido") . "#" . $cnn . "#" .$rs->value("nombre_es") ;
echo "DEBUG: " . $k ."=>".$d . "<BR>";
$tprods += Array($k=>$d) ;
}
$ct /=2 ;
}
// Ordenar lista temporal...
ksort($tprods) ;
reset($tprods) ;
// Ahora expandir cada nodo
while ($c = each($tprods)) {
array_push($cn,$cont) ;
$v = explode("#",$c["value"]) ;
expand($v[1],$v[0],$p) ;
array_pop($cn) ;
$cont++ ;
}
}
ECHO "result: " . count($prods) . "<br>" ;
while ($c = each($prods)) {
echo $c["value"] . "<br>" ;
}

====================================================
Resultado:

DEBUG: Inserting 8#1##Elemento 0
DEBUG: 1=>4#16##Elemento 0-0
DEBUG: 2=>4#2##Elemento 0-1
DEBUG: Inserting 4#16##Elemento 0-0
DEBUG: Inserting 4#2##Elemento 0-1
DEBUG: 1=>2#14##Elemento 0-1-0
DEBUG: Inserting 2#14#1#Elemento 0-1-0
result: 3
8#1##División dermocosmética
4#16##Línea Capilar
4#2##Línea pieles grasas

====================================================
Carlos Falo
BIS INTERACTIVE, SL
Manila, 54-56 esc.A entlo. 4ª
08034 BARCELONA (Spain)
Tel. (+34) 93 280 30 09 / 93 206 36 52
Fax (+34) 93 206 36 89
e-mail: carles@bisinteractive.net
http://www.bisinteractive.net

Search Discussions

  • Carlos Falo Hervás at Jun 10, 2004 at 8:27 am
    Problema resuelto, era una tontada... estaba entrando claves en el array
    duplicadas... y no insertaba (logicamente....) a veces cuando te saturas
    comentes errores tontos... no hay nada que una noche de buen sueño y unos
    cafes no arreglen :)

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
groupphp-general-es @
categoriesphp
postedJun 9, '04 at 3:49p
activeJun 10, '04 at 8:27a
posts2
users1
websitephp.net

1 user in discussion

Carlos Falo Hervás: 2 posts

People

Translate

site design / logo © 2022 Grokbase