Jump to content
Sign in to follow this  
theone87

Funçao recursiva em async tree

Recommended Posts

theone87

Bom dia, vinha por este meio pedir a ajuda pois estou a tentar usar uma função recursiva na criação de uma arvore e não estou a conseguir porque me da erro de memoria. Ja encontrei varia informação acerca disto e a maior parte incentivava a mudar a memoria predifinida que vem no php mas o que eu realmente queria que me ajudassem era de alguma forma que a função parasse e não andasse num ciclo "infinito" ate nao ter mais memoria. Se alguem me puder ajudar agradeço..

Deixo aqui o codigo:

function treeview()
{	
$i = 0;
$result = array();
$rs = mysql_query("select * from dados3 where nivel = 1");
while($row = mysql_fetch_array($rs))
{
	$node = array();
	$node['id'] = $row['id'];
	$node['text'] = $row['descricao'];
	$node['state'] = 'closed';
	$node['children'] = has_child($row['id']);
	array_push($result, $node);
}  
echo json_encode($result);
}

function has_child($id){

$result2 = array();
$node_2 = array();
$rs = mysql_query("select * from dados3 where id_nivel_superior=$id");
$row = mysql_fetch_array($rs);
$node_2['text'] = $row['descricao'];
$node_2['state'] = 'closed';
$node_2['children'] = has_child($id , -3);
array_push($result2, $node_2);
return $result2;
}

Com os melhores cumprimentos.

Share this post


Link to post
Share on other sites
HappyHippyHippo

$node_2['children'] = has_child($id , -3);
//                               A
//                               |
//                não seria somente o ID do registo "pai"/$row ?
//                  pensa bem no que estás a chamar ...
//               principalmente no SQL da função "has_child"

-----------------

conclusão :

//function treeview($id == null)   <--- EDIT : está errado
function treeview($id = null)
{    
   $result = array();
   $rs = mysql_query("select * from dados3 where " . ($id == null ? "nivel = 1" : "id_nivel_superior = {$id}"));
   while($row = mysql_fetch_array($rs))
   {
       $node = array();
       $node['id'] = $row['id'];
       $node['text'] = $row['descricao'];
       $node['state'] = 'closed';
       $node['children'] = treeview($row['id']);
       array_push($result, $node);
   }  
   echo json_encode($result);
}

$treeview = treeview();

ps : acho estranho a existência de "nivel" e "id_nivel_superior" ... mas isso é lá contigo ...

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
theone87

Peço desculpa, esse "-3" nao era suposto estar ai. Isso foi uma tentativa minha. Eu passo-lhe somente o $id e mesmo assim nao da.

Share this post


Link to post
Share on other sites
theone87

$node_2['children'] = has_child($id , -3);
//							   A
//							   |
//				não seria somente o ID do registo "pai"/$row ?
//				  pensa bem no que estás a chamar ...
//			   principalmente no SQL da função "has_child"

-----------------

conclusão :

function treeview($id == null)
{	
$result = array();
$rs = mysql_query("select * from dados3 where " . ($id == null ? "nivel = 1" : "id_nivel_superior = {$id}"));
while($row = mysql_fetch_array($rs))
{
	$node = array();
	$node['id'] = $row['id'];
	$node['text'] = $row['descricao'];
	$node['state'] = 'closed';
	$node['children'] = treeview($row['id']);
	array_push($result, $node);
}  
echo json_encode($result);
}

$treeview = treeview();

ps : acho estranho a existência de "nivel" e "id_nivel_superior" ... mas isso é lá contigo ...

O "nivel" e "id_nivel_superior" é para poder relacionar para saber os niveis de arvore e saber quem é filho de quem e vice versa. O codigo que disponibilizaste nao percebo o porque do id a nulo pois eu quero que para cada id ele veja se tem filhos e se tiver que os mostre, nao sei se me fiz perceber. Se me pudesses esclarecer a minha duvida agradecia ate porque ao correr esse codigo os filhos ficam todos a nulo.

Share this post


Link to post
Share on other sites
HappyHippyHippo

O "nivel" e "id_nivel_superior" é para poder relacionar para saber os niveis de arvore e saber quem é filho de quem e vice versa.

a questão é que bastaria um campo para fazer esse tipo de relação ...

O codigo que disponibilizaste nao percebo o porque do id a nulo pois eu quero que para cada id ele veja se tem filhos e se tiver que os mostre, nao sei se me fiz perceber.

o $id a nulo serve para identificar a primeira chamada da função (ao contrário da chamada recursiva).

Se me pudesses esclarecer a minha duvida agradecia ate porque ao correr esse codigo os filhos ficam todos a nulo.

se dá tudo a nulos é porque o problema está na tua base de dados e/ou os dados que ai contens ... porque o resultado do código é equivalente ao que tens no teu primeiro post (com a correcção aparente que necessitavas)

ps : alterei o código no post original ... a atribuição no protótipo da função é só com um caracter =

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
theone87

Vou-te enviar um screen da base de dados porque nao consigo compreender o que esteja mal para que apareça a nulo. Deixo aqui tambem outra forma que tentei para resolver o problema e tambem me deu os filhos a nulo por isso muito provavelmente teras razao e o problema estará na base de dados.

function treeview()
{   
   $i = 0;
   $result = array();
   $rs = mysql_query("select * from dados3 where nivel = 1");
   while($row = mysql_fetch_array($rs))
   {
       $node = array();
       $node['id'] = $row['id'];
       $node['text'] = $row['descricao'];
       $node['state'] = 'closed';
       $node['children'] = has_child($row['id']);
       array_push($result, $node);
   } 
echo json_encode($result);
}

function has_child($id){

   $result2 = array();
   $node_2 = array();
   $rs = mysql_query("select * from dados3 where id_nivel_superior=$id");
   while($row = mysql_fetch_array($rs))
   {
       $node_2['text'] = $row['descricao'];
       $node_2['state'] = 'closed';
       $node_2['children'] = has_child($row['id']);
       array_push($result2, $node_2);
       return $result2;
   }
}

untitled.JPG

https://www.dropbox.com/s/z6ftuy33oxumx3e/untitled.JPG

Edited by brunoais
geshi

Share this post


Link to post
Share on other sites
HappyHippyHippo

antes de mais, os valores na coluna id_nivel_superior não fazem sentido

segundo, o código que apresentei deverá funcionar


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
theone87

antes de mais, os valores na coluna id_nivel_superior não fazem sentido

segundo, o código que apresentei deverá funcionar

Ok, podem ate nao fazer sentido mas foi uma forma que arranjei para me guiar melhor. Quanto ao codigo que me disponibilizaste nao funciona dai ter-te mandado o screen da base de dados para teres uma melhor perceção do programa.

[][][][{"id":"3","text":"1.1 - Sub.","state":"closed","children":null},{"id":"8","text":"1.2 - Sub.","state":"closed","children":null},{"id":"12","text":"1.3 - Sub.","state":"closed","children":null}][][{"id":"11","text":"2.1.1 - Sub_sub","state":"closed","children":null}][][][{"id":"10","text":"2.1 - Sub.","state":"closed","children":null},{"id":"13","text":"2.2 - Sub.","state":"closed","children":null},{"id":"14","text":"2.3 - Sub.","state":"closed","children":null}][][][][{"id":"6","text":"3.1 - Sub.","state":"closed","children":null},{"id":"15","text":"3.2 - Sub.","state":"closed","children":null},{"id":"16","text":"3.3 - Sub.","state":"closed","children":null}][][][][{"id":"9","text":"4.1 - Sub.","state":"closed","children":null},{"id":"17","text":"4.2 - Sub.","state":"closed","children":null},{"id":"18","text":"4.3 - Sub.","state":"closed","children":null}][{"id":"1","text":"1 - Cat.","state":"closed","children":null},{"id":"2","text":"2 - Cat.","state":"closed","children":null},{"id":"4","text":"3- Cat.","state":"closed","children":null},{"id":"5","text":"4 - Cat.","state":"closed","children":null}][][][][{"id":"3","text":"1.1 - Sub.","state":"closed","children":null},{"id":"8","text":"1.2 - Sub.","state":"closed","children":null},{"id":"12","text":"1.3 - Sub.","state":"closed","children":null}][][{"id":"11","text":"2.1.1 - Sub_sub","state":"closed","children":null}][][][{"id":"10","text":"2.1 - Sub.","state":"closed","children":null},{"id":"13","text":"2.2 - Sub.","state":"closed","children":null},{"id":"14","text":"2.3 - Sub.","state":"closed","children":null}][][][][{"id":"6","text":"3.1 - Sub.","state":"closed","children":null},{"id":"15","text":"3.2 - Sub.","state":"closed","children":null},{"id":"16","text":"3.3 - Sub.","state":"closed","children":null}][][][][{"id":"9","text":"4.1 - Sub.","state":"closed","children":null},{"id":"17","text":"4.2 - Sub.","state":"closed","children":null},{"id":"18","text":"4.3 - Sub.","state":"closed","children":null}][{"id":"1","text":"1 - Cat.","state":"closed","children":null},{"id":"2","text":"2 - Cat.","state":"closed","children":null},{"id":"4","text":"3- Cat.","state":"closed","children":null},{"id":"5","text":"4 - Cat.","state":"closed","children":null}]

Isto é o que gera, como ves os filhos continuam a nulo, se em vez de usar recursividade selecionar algo para mostrar nos filhos ele mostra mas a ideia era mesmo recorrer a recursividade para poder acrescentar mais niveis.

Share this post


Link to post
Share on other sites
HappyHippyHippo

olha lá ... como é que se a tua base de dados tem a informação que apresentas na imagem e agora apresentas um resultado desses ??

primeiro elemento do JSON:

id = 3

text = 1.1 - Sub.

elemento na base de dados:

id = 3

text = subcategoria_1

.. agora explica este milagre ...


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
theone87

olha lá ... como é que se a tua base de dados tem a informação que apresentas na imagem e agora apresentas um resultado desses ??

primeiro elemento do JSON:

id = 3

text = 1.1 - Sub.

elemento na base de dados:

id = 3

text = subcategoria_1

.. agora explica este milagre ...

Desculpa mandei-te o codigo errado.. vou-te mandar o correto. Esqueci-me de referir que no 3nivel ele repete tudo de novo ( os 3niveis).

[{"id":"1","text":"1 - Cat.","state":"closed","children":[{"text":"1.1 - Sub.","state":"closed","children":[]},{"text":"1.2 - Sub.","state":"closed","children":[]},{"text":"1.3 - Sub.","state":"closed","children":[]}]},{"id":"2","text":"2 - Cat.","state":"closed","children":[{"text":"2.1 - Sub.","state":"closed","children":[{"text":"2.1.1 - Sub_sub","state":"closed","children":[]}]},{"text":"2.2 - Sub.","state":"closed","children":[]},{"text":"2.3 - Sub.","state":"closed","children":[]}]},{"id":"4","text":"3- Cat.","state":"closed","children":[{"text":"3.1 - Sub.","state":"closed","children":[]},{"text":"3.2 - Sub.","state":"closed","children":[]},{"text":"3.3 - Sub.","state":"closed","children":[]}]},{"id":"5","text":"4 - Cat.","state":"closed","children":[{"text":"4.1 - Sub.","state":"closed","children":[]},{"text":"4.2 - Sub.","state":"closed","children":[]},{"text":"4.3 - Sub.","state":"closed","children":[]}]}]

Share this post


Link to post
Share on other sites
HappyHippyHippo

Desculpa mandei-te o codigo errado.. vou-te mandar o correto. Esqueci-me de referir que no 3nivel ele repete tudo de novo ( os 3niveis).

isso é erro das relações na base de dados, que como disse anteriormente, estão uma salgalhada pegada além de não existir correspondência entre a demosntrada na imagem com a apresentada no JSON


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
theone87

isso é erro das relações na base de dados, que como disse anteriormente, estão uma salgalhada pegada além de não existir correspondência entre a demosntrada na imagem com a apresentada no JSON

Tens razao depois de ter feito a alteraçao tambem fiz alteraçoes na base de dados. Fica aqui o link para ver se me consegues dar uma ajuda, que isto ja vai para aqui uma grande confusao.

https://www.dropbox.com/s/z6ftuy33oxumx3e/untitled.JPG

Share this post


Link to post
Share on other sites
HappyHippyHippo

o JSON resultado é válido para os dados da imagem (tirando a última entrada)

[
  {
     "id":"1",
     "text":"1 - Cat.",
     "state":"closed",
     "children":[
        {
           "text":"1.1 - Sub.",
           "state":"closed",
           "children":[

           ]
        },
        {
           "text":"1.2 - Sub.",
           "state":"closed",
           "children":[

           ]
        },
        {
           "text":"1.3 - Sub.",
           "state":"closed",
           "children":[

           ]
        }
     ]
  },
  {
     "id":"2",
     "text":"2 - Cat.",
     "state":"closed",
     "children":[
        {
           "text":"2.1 - Sub.",
           "state":"closed",
           "children":[
              {
                 "text":"2.1.1 - Sub_sub",
                 "state":"closed",
                 "children":[

                 ]
              }
           ]
        },
        {
           "text":"2.2 - Sub.",
           "state":"closed",
           "children":[

           ]
        },
        {
           "text":"2.3 - Sub.",
           "state":"closed",
           "children":[

           ]
        }
     ]
  },
  {
     "id":"4",
     "text":"3- Cat.",
     "state":"closed",
     "children":[
        {
           "text":"3.1 - Sub.",
           "state":"closed",
           "children":[

           ]
        },
        {
           "text":"3.2 - Sub.",
           "state":"closed",
           "children":[

           ]
        },
        {
           "text":"3.3 - Sub.",
           "state":"closed",
           "children":[

           ]
        }
     ]
  },
  {
     "id":"5",
     "text":"4 - Cat.",
     "state":"closed",
     "children":[
        {
           "text":"4.1 - Sub.",
           "state":"closed",
           "children":[

           ]
        },
        {
           "text":"4.2 - Sub.",
           "state":"closed",
           "children":[

           ]
        },
        {
           "text":"4.3 - Sub.",
           "state":"closed",
           "children":[

           ]
        }
     ]
  }
]


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
theone87

o JSON resultado é válido para os dados da imagem (tirando a última entrada)

[
{
"id":"1",
"text":"1 - Cat.",
"state":"closed",
"children":[
{
"text":"1.1 - Sub.",
"state":"closed",
"children":[

]
},
{
"text":"1.2 - Sub.",
"state":"closed",
"children":[

]
},
{
"text":"1.3 - Sub.",
"state":"closed",
"children":[

]
}
]
},
{
"id":"2",
"text":"2 - Cat.",
"state":"closed",
"children":[
{
"text":"2.1 - Sub.",
"state":"closed",
"children":[
{
"text":"2.1.1 - Sub_sub",
"state":"closed",
"children":[

]
}
]
},
{
"text":"2.2 - Sub.",
"state":"closed",
"children":[

]
},
{
"text":"2.3 - Sub.",
"state":"closed",
"children":[

]
}
]
},
{
"id":"4",
"text":"3- Cat.",
"state":"closed",
"children":[
{
"text":"3.1 - Sub.",
"state":"closed",
"children":[

]
},
{
"text":"3.2 - Sub.",
"state":"closed",
"children":[

]
},
{
"text":"3.3 - Sub.",
"state":"closed",
"children":[

]
}
]
},
{
"id":"5",
"text":"4 - Cat.",
"state":"closed",
"children":[
{
"text":"4.1 - Sub.",
"state":"closed",
"children":[

]
},
{
"text":"4.2 - Sub.",
"state":"closed",
"children":[

]
},
{
"text":"4.3 - Sub.",
"state":"closed",
"children":[

]
}
]
}
]

Pois, mas o problema é que ele nao me mostra o ultimo filho.

Share this post


Link to post
Share on other sites
theone87

executa novamente o código ... e se voltar a não apresentar diz

Continua exatamente na mesma, ele no 4nivel onde seria suposto apresentar o ultimo filho continua sempre a repertir o ciclo com os outros niveis todos. Acho que podera ter a ver com o nao conseguir fazer parar o ciclo na recursividade.

Share this post


Link to post
Share on other sites
HappyHippyHippo

assim é impossível, continuas a dar informação contraditória ...

apresentas um resultado onde não aparece o último elemento da tabela (coisa que parece devido a teres criado o registo após a criação do JSON) e depois continuas a dizer que existe uma repetição dos ciclos !!!

assim é impossível, mexes nos dados, apresentas outros dados e dizes que o resultado é um terceiro cenário ... eu, por mim, enquanto não apresentares informação coerente vou passar a ignorar este tópico.


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
theone87

assim é impossível, continuas a dar informação contraditória ...

apresentas um resultado onde não aparece o último elemento da tabela (coisa que parece devido a teres criado o registo após a criação do JSON) e depois continuas a dizer que existe uma repetição dos ciclos !!!

assim é impossível, mexes nos dados, apresentas outros dados e dizes que o resultado é um terceiro cenário ... eu, por mim, enquanto não apresentares informação coerente vou passar a ignorar este tópico.

Peço desculpa mas estamos que estamos "desencontrados" na informação que estamos a trocar porque é precisamente o ultimo elemento da base de dados que eu quero mostrar no 4 nivel e ele realmente aparece mas depois dentro deste num 5nivel que nao e suposto exisitir ele continua a repetir os outros niveis. Vou-te deixar aqui um link com a imagem do que realmente me acontece para ver se consegues compreender o que eu estou a dizer, visto que secalhar nao seja facil perceber o que eu estou a dizer sem realmente mostrar.

https://www.dropbox.com/s/ka5bzcjg5emrqi4/untitled2.JPG

E quanto ao JSON e a base de dados e ao codigo continua exatamente tudo na mesma, nao fiz qualquer alteraçao desde a ultima "versao" que te disponibilizei. Agradecia ajuda e peço desculpa por estar a dificultar-te tanto a vida mas nao é com intenção pelo contrario.

Share this post


Link to post
Share on other sites
HappyHippyHippo

não deixa de ser contraditório :

- como é que no JSON não existe essa informação e de repente aparece no resultado final

se o ciclo fosse problema de interpretação do JSON a entrada "Faq.1 ..." nem deveria aparecer, porque é uma entrada que não existe !!!

na programação não existem milagres, ou continuas a não apresentar a informação actual ou andas a apresentar informação que não é a usada para apresentar o resultado final


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
theone87

não deixa de ser contraditório :

- como é que no JSON não existe essa informação e de repente aparece no resultado final

se o ciclo fosse problema de interpretação do JSON a entrada "Faq.1 ..." nem deveria aparecer, porque é uma entrada que não existe !!!

na programação não existem milagres, ou continuas a não apresentar a informação actual ou andas a apresentar informação que não é a usada para apresentar o resultado final

Refereste a isto:

[{"text":"2.1.1 - Sub_sub","state":"closed","children":[{"text":"Faq 1 - categoria 1","state":"closed","children":[]}]}]}

? É que aparece no JSON... ou entao percebi mal. Vou-te deixar aqui os ficheiros que estou a utilizar porque alguma coisa me esta mesmo a ultrupassar pois eu ja percebi o que queres dizer mas nao faz sentido entao o que me esta a acontecer. Dá uma vista de olhos nos ficheiros se puderes, porque nao consigo descobrir de onde vem o problema.

https://www.dropbox.com/s/mseitz6lpzw7xi5/get_datav4.php

https://www.dropbox.com/s/gkxdrldcmkabgsy/index_v4.php

Edited by theone87

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.