vdepizzol 0 Denunciar post Postado Maio 30, 2005 Oi, Achei na internet um script bem legal que pega valores de um banco de dados* e monta uma tabela no estilo árvore, como no Windows Explorer. *O banco de dados é organizado assim: tem as colunas id, nome e pid... (pid indica qual o id-pai) (no script tem tb a coluna tipo, mas não tem nada a ver com a oganizacao da arvore)... O script: PHP [*]<? [*] [*]mysql_connect('localhost', 'root', '') or die(mysql_error()); [*]mysql_select_db('ibiracu') or die(mysql_error()); [*] [*]function get_tree() { [*] global $current_level; [*] [*] $result = mysql_query('SELECT id, nome, pid, tipo [*] FROM `mapa-paginas` [*] ORDER BY nome') or die(mysql_error()); [*] [*] while ($row = mysql_fetch_array($result)) { [*] // create an array containing _all_ of the cateogries [*] $temp_tree[] = array( [*] 'id' => $row['id'], [*] 'nome' => $row['nome'], [*] 'pid' => $row['pid'], [*] 'tipo' => $row['tipo'] [*] ); [*] } [*] $temp_tree2 = $temp_tree; [*] [*] foreach ($temp_tree as $key => $value) { [*] if (!$value['pid']) { [*] // all right, it's a root category [*] $current_level = 0; [*] [*] $new_tree[] = array( [*] 'id' => $value['id'], [*] 'nome' => $value['nome'], [*] 'pid' => $value['pid'], [*] 'tipo' => $value['tipo'], [*] 'level' => $current_level [*] ); [*] [*] if ($branch = get_leafs($temp_tree, $value['id'])) { [*] // merge the new array with the old array [*] $new_tree = array_merge($new_tree, $branch); [*] } [*] } [*] } [*] [*] return isset($new_tree) ? $new_tree : false; [*]} [*] [*]function get_leafs($temp_tree, $id) { [*] global $current_level; [*] [*] $current_level++; [*] [*] foreach ($temp_tree as $key => $value) { [*] if ($value['pid'] == $id) { [*] // all right, the parent id is a match [*] $new_tree[] = array( [*] 'id' => $value['id'], [*] 'nome' => $value['nome'], [*] 'pid' => $value['pid'], [*] 'tipo' => $value['tipo'], [*] 'level' => $current_level [*] ); [*] [*] if ($branch = get_leafs($temp_tree, $value['id'])) { [*] // merge the new array with the old array [*] $new_tree = array_merge($new_tree, $branch); [*] } [*] [*] $current_level--; [*] } [*] } [*] [*] return isset($new_tree) ? $new_tree : false; [*]} [*] [*]?> Como chamar o script: PHP [*] <? [*]foreach (get_tree() as $value) { [*] echo str_repeat("--", $value['level'])." ".$value['nome']."<br />\n"; [*]} [*]?> O banco de dados em árvore funciona certo... acontece que eu to precisando modifica-lo e fazer, com que, por exemplo, só seja mostrado os filhos do id 5 (e todos os filhos dos filhos de 5 e por aí). Alguém tem alguma idéia? Compartilhar este post Link para o post Compartilhar em outros sites
vdepizzol 0 Denunciar post Postado Junho 1, 2005 Ninguém? :huh: Compartilhar este post Link para o post Compartilhar em outros sites
wolfphw 60 Denunciar post Postado Junho 1, 2005 fiquei perdido...... Compartilhar este post Link para o post Compartilhar em outros sites
vdepizzol 0 Denunciar post Postado Junho 1, 2005 Eu também nao entendi essas duas funções... principalmente a variavel $branch... O que ela faz afinal??? Se alguém souber... Compartilhar este post Link para o post Compartilhar em outros sites
Wilker 3 Denunciar post Postado Junho 1, 2005 realmente esse script ta um poko confuso... e uma coisa, eu acho q seria + facil fazer isso com XML, pois XML (principalmente a API DOM) ja é montada em estrutura de arvore, ai criar menus assim por XML eh bem + facil, c você n mexe com XML, da uma estudada, eh bem legal, e qto a API DOM, eu to terminando um tutorial completo sobre o uso dela, q ta aki mesmo no forum, la no Laboratorio de Scripts, ja tem as partes 1 e 2 do tutorial la, soh falta 1 parte, c quizer dar uma olhada: Parte 1 - http://www.imasters.com.br/forum/index.php?showtopic=132386 Parte 2 - http://www.imasters.com.br/forum/index.php?showtopic=133012 flw Compartilhar este post Link para o post Compartilhar em outros sites
vdepizzol 0 Denunciar post Postado Junho 1, 2005 Wilker, eu não to pensando em usar XML... Agora eu entendi mais ou menos como funciona essas duas funcoes... só nao entendi pra que serve a primeira variavel ($temp_tree) para a funcao get_leafs() PHP [*]function get_leafs($temp_tree, $id) { [*] global $current_level; [*] [*] $current_level++; [*] [*] foreach ($temp_tree as $key => $value) { [*] if ($value['pid'] == $id) { [*] // all right, the parent id is a match [*] $new_tree[] = array( [*] 'id' => $value['id'], [*] 'nome' => $value['nome'], [*] 'pid' => $value['pid'], [*] 'tipo' => $value['tipo'], [*] 'level' => $current_level [*] ); [*] [*] if ($branch = get_leafs($temp_tree, $value['id'])) { [*] // merge the new array with the old array [*] $new_tree = array_merge($new_tree, $branch); [*] } [*] [*] $current_level--; [*] } [*] } [*] [*] return isset($new_tree) ? $new_tree : false; [*]} [*] Compartilhar este post Link para o post Compartilhar em outros sites
felipe maricato moura 0 Denunciar post Postado Junho 2, 2005 galera na boa isso ai é só prar bancos que não tem nem autorelacionamento tipo mysql se tu ta usando pg ou oracle é melhor trazer a estrutuda direto do bando com o CONNECTBY Compartilhar este post Link para o post Compartilhar em outros sites
vdepizzol 0 Denunciar post Postado Junho 2, 2005 Cara, a linguagem q você viu a cima é PHP e MySQL!!!! Olha bem q você vai ver.... Compartilhar este post Link para o post Compartilhar em outros sites
vdepizzol 0 Denunciar post Postado Junho 4, 2005 Pessoal, to quase conseguindo... olha só o q eu fiz: PHP [*]function get_parents($id) { [*] [*] // Pega do banco de dados todas as paginas [*] $result = mysql_query('SELECT id, nome, pid, tipo [*] FROM `mapa-paginas` [*] ORDER BY nome') or die(mysql_error()); [*] [*] while ($row = mysql_fetch_array($result)) { [*] // cria um array contendo todas as paginas [*] $arvore_temporaria[] = array( [*] 'id' => $row['id'], [*] 'nome' => $row['nome'], [*] 'pid' => $row['pid'], [*] ); [*] } // fecha while [*] [*] // procura no array a pagina que tem o id igual ao identificado na funcao [*] foreach ($arvore_temporaria as $key => $valor) { [*] if($valor['id'] == $id) { [*] $valor_filho['pid'] = $valor['pid']; [*] $valor_filho['nome'] = $valor['nome']; [*] $valor_filho['id'] = $valor['id']; [*] } // fecha if [*] } // fecha foreach [*] [*] [*] foreach ($arvore_temporaria as $key => $valor) { [*] [*] if ($valor_filho['pid'] == $valor['id']) { [*] // tudo certo, esse é o pai do filho (o identificado na chamada da funcao) [*] [*] // cria uma nova array [*] $nova_arvore[] = array( [*] 'id' => $valor['id'], [*] 'nome' => $valor['nome'], [*] 'pid' => $valor['pid'], [*] ); [*] [*] [*] if ($branch = get_parents($valor['id'])) { [*] // junta a nova array com a do loop anterior [*] $nova_arvore = array_merge($nova_arvore, $branch); [*] } // fecha if [*] } // fecha if [*] } // fecha foreach [*] [*] return isset($nova_arvore) ? $nova_arvore : false; [*] [*] [*]} // fecha function E na hora de chamar a função, usei o seguinte: PHP [*] [*]<? // Pega todos os pais do id 17 [*]foreach (get_parents(17) as $valor) { [*] echo $valor['nome']." > "; [*]} [*]?> [*] Essa função funciona certo... mas ela aparece ao contrário... por exemplo: Ao invés de aparecer: Página Principal > Pontos Turísticos > Mosteiro Zen Budista Aparece Mosteiro Zen Budista > Pontos Turísticos > Página Principal Como faço para inverter a lista? Compartilhar este post Link para o post Compartilhar em outros sites
vdepizzol 0 Denunciar post Postado Junho 4, 2005 Consegui!!!! =) Fiz assim na hora de chamar a função: PHP [*]foreach (array_reverse(get_parents(17)) as $valor) { [*] echo $valor['nome']." > "; [*]} Compartilhar este post Link para o post Compartilhar em outros sites
felipe maricato moura 0 Denunciar post Postado Agosto 30, 2005 eu sei vdepizzol só estava dando um dica entendeu!!!! Compartilhar este post Link para o post Compartilhar em outros sites
vdepizzol 0 Denunciar post Postado Agosto 30, 2005 [depois de alguns meses...]ah tá... beleza =) Compartilhar este post Link para o post Compartilhar em outros sites