Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

vdepizzol

Banco de Dados em árvore

Recommended Posts

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

fiquei perdido......

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

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

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

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

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

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

eu sei vdepizzol só estava dando um dica entendeu!!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.