Ajuda com funcao recursiva PHP/MySQL/CI

260 views
Skip to first unread message

Cleyverson Costa

unread,
Apr 15, 2009, 10:55:16 AM4/15/09
to php...@yahoogrupos.com.br, list...@googlegroups.com
Pessoal,

Me da um help por favor. Estou fazendo uma função recursiva simples, mas nao to achando o erro no retorno...

Eu dando o echo a estrutura eh impressa correamente (amarelo) mas nao to conseguindo passar os valores para o controller...nao to sabendo colocar corretamente a condição de parada...alguem pode me ajudar por favor...

Segue o codigo.


$news['comments'] = $this->News_M->get_news_
comment($id_news, 1, 0);

   function get_news_comment($id_news, $level, $parent) {
       $count = 1;
       $query = $this->db->query("SELECT *, unix_timestamp(NOW()) as seg_atual, unix_timestamp( register_date ) as seg_bd FROM nws_comment WHERE id_news='$id_news' AND parent='$parent' ORDER BY id_comment");
       if ($this->db->affected_rows() >= 1) {      
           foreach ($query->result_array() as $row) {
            echo $level.'-'.$row['comment'].'<br>';
               $news[$count]['id_comment'] = $row['id_comment'];
               $news[$count]['id_user'] = $row['id_user'];
               $news[$count]['id_news'] = $row['id_news'];                
               $news[$count]['register_date'] = $row['register_date'];
               $news[$count]['seg_atual'] = $row['seg_atual'];
               $news[$count]['seg_bd'] = $row['seg_bd'];                
               $news[$count]['comment'] = $row['comment'];
               $count++;

           $this->get_news_comment($id_news, $level+1, $row['id_comment']);
           
           return $news;
           }
       } else {
           return null;
       }
   }

Anderson Fraga

unread,
Apr 15, 2009, 12:26:34 PM4/15/09
to list...@googlegroups.com
Não pode-se usar WHILE ao invés de FOREACH na iteração?
 

Cleyverson Costa

unread,
Apr 15, 2009, 12:38:30 PM4/15/09
to LISTA PHP
Posso, mas qual a diferença???

Alguma outra sugestão??

On 15 abr, 13:26, "Anderson Fraga" <gro...@andersonfraga.net> wrote:
> Não pode-se usar WHILE ao invés de FOREACH na iteração?
>
> Sds,
> Anderson Fraga
> cont...@andersonfraga.netwww.andersonfraga.net

Cleyverson Costa

unread,
Apr 15, 2009, 12:45:11 PM4/15/09
to LISTA PHP
Posso, mas qual a diferença???

Alguma outra sugestão??

On 15 abr, 13:26, "Anderson Fraga" <gro...@andersonfraga.net> wrote:
> Não pode-se usar WHILE ao invés de FOREACH na iteração?
>
> Sds,
> Anderson Fraga
> cont...@andersonfraga.netwww.andersonfraga.net

André Oliveira

unread,
Apr 15, 2009, 12:45:42 PM4/15/09
to list...@googlegroups.com
$news['comments'] = $this->News_M->get_news_
comment($id_news, 1, 0);
 $count = 1;
   function get_news_comment($id_news, $level, $parent) {

     
       $query = $this->db->query("SELECT *, unix_timestamp(NOW()) as seg_atual, unix_timestamp( register_date ) as seg_bd FROM nws_comment WHERE id_news='$id_news' AND parent='$parent' ORDER BY id_comment");
       if ($this->db->affected_rows() >= 1) {      
           foreach ($query->result_array() as $row) {
            echo $level.'-'.$row['comment'].'<br>';
               $news[$count]['id_comment'] = $row['id_comment'];
               $news[$count]['id_user'] = $row['id_user'];
               $news[$count]['id_news'] = $row['id_news'];                
               $news[$count]['register_date'] = $row['register_date'];
               $news[$count]['seg_atual'] = $row['seg_atual'];
               $news[$count]['seg_bd'] = $row['seg_bd'];                
               $news[$count]['comment'] = $row['comment'];
               $count++;

        
           
         
           }
         $this->get_news_comment($id_news, $level+1, $row['id_comment']);
       } else {
           return $news;
       }
   }

acho que isso funciona...


2009/4/15 Cleyverson Costa <cleyver...@gmail.com>

Anderson Fraga

unread,
Apr 15, 2009, 1:01:47 PM4/15/09
to list...@googlegroups.com
Apenas algo 'pessoal' rsrsrs

Iterações de banco nunca 'me dei bem' com foreach. Vou até fazer uns testes
para ver o porquê.

Cleyverson Costa

unread,
Apr 15, 2009, 1:07:00 PM4/15/09
to LISTA PHP
Pessoal,

Infelizmente ate o momento nao ta dando certo...

Parece eh que eu to perdendo os valores depois que o return é dado...

Sei la...nao to entendendo...

Acho que to eh precisando durmir um pouco :)

Se alguem tiver mais alguma sugestão...será mt bem vinda!

Abraços

On 15 abr, 14:01, "Anderson Fraga" <gro...@andersonfraga.net> wrote:
> Apenas algo 'pessoal' rsrsrs
>
> Iterações de banco nunca 'me dei bem' com foreach. Vou até fazer uns testes
> para ver o porquê.
>
> Sds,
> Anderson Fraga
> cont...@andersonfraga.netwww.andersonfraga.net
>
> ----- Original Message -----
> From: "Cleyverson Costa" <cleyversonco...@gmail.com>
> To: "LISTA PHP" <list...@googlegroups.com>
> Sent: Wednesday, April 15, 2009 1:45 PM
> Subject: [ PHP - Google ] Re:AjudacomfuncaorecursivaPHP/MySQL/CI
>
> Posso, mas qual a diferença???
>
> Alguma outra sugestão??
>
> On 15 abr, 13:26, "Anderson Fraga" <gro...@andersonfraga.net> wrote:
> > Não pode-se usar WHILE ao invés de FOREACH na iteração?
>
> > Sds,
> > Anderson Fraga
> > cont...@andersonfraga.netwww.andersonfraga.net
>
> > ----- Original Message -----
> > From: Cleyverson Costa
> > To: php...@yahoogrupos.com.br ; list...@googlegroups.com
> > Sent: Wednesday, April 15, 2009 11:55 AM
> > Subject: [ PHP - Google ]AjudacomfuncaorecursivaPHP/MySQL/CI
>
> > Pessoal,
>
> > Me da um help por favor. Estou fazendo uma funçãorecursivasimples, mas

Carlos Moraes

unread,
Apr 15, 2009, 1:49:14 PM4/15/09
to LISTA PHP
(...)
$news[$count]['comment'] = $row['comment'];
$count++;

// TENTA JOGAR O RESULTADO DESSA LINHA ABAIXO EM ALGUM LUGAR
$this->get_news_comment($id_news, $level+1, $row['id_comment']); //
<<<<<<<<<<< JOGA O RESULTADO DISSO EM ALGUM LUGAR

return $news;
}
(...)

Cleyverson Costa

unread,
Apr 16, 2009, 12:39:06 AM4/16/09
to LISTA PHP
O que estou tentando fazer eh o seguinte:

Preciso criar uma arvore de comentarios (identados)

id_comment parent comment
227 0 1
228 0 2
229 0 3
230 227 1.1
231 229 3.1
232 228 2.2
233 231 3.1.1

Dessa forma eu teria o seguinte array


227 (1)
230 (1.1)
228 (2)
232 (2.1)
229 (3)
231 (3.1)
233 (3.1.1)

Eu to tentando fazer com a funcao recursiva que mandei...

O echo ate imprime na ordem correta, mas nao estou conseguindo guardar
o valor completo...esta sobrepondo e nao to entendeo pq.

Se alguem tiver alguma sugestao...

Carlos Moraes

unread,
Apr 16, 2009, 9:47:14 AM4/16/09
to list...@googlegroups.com
camarada, entendi o que tu pretende agora  ... fiz um pequeno ajuste no teu código original. Tu tava tentando somar 1 quando precisava concatenar o próximo numero com o número do nivel anterior, se não entender muito bem só roda como tá aí que acho que vai funcionar

abraço

----

$news['comments'] = $this->News_M->get_news_comment($id_news, "", 0);


function get_news_comment($id_news, $level, $parent)
{
    $count = 1;
    $query = $this->db->query("SELECT *, unix_timestamp(NOW()) as seg_atual, unix_timestamp( register_date ) as seg_bd FROM nws_comment WHERE id_news='$id_news' AND parent='$parent' ORDER BY id_comment");
    if ($this->db->affected_rows() >= 1)
    {
        foreach ($query->result_array() as $row)
        {
            $contador++;
            echo $level . '.' . $contador . "-" . $row['comment'].'<br>';
           
           
            $news[$count]['id_comment'] = $row['id_comment'];
            $news[$count]['id_user'] = $row['id_user'];
            $news[$count]['id_news'] = $row['id_news'];               
            $news[$count]['register_date'] = $row['register_date'];
            $news[$count]['seg_atual'] = $row['seg_atual'];
            $news[$count]['seg_bd'] = $row['seg_bd'];               
            $news[$count]['comment'] = $row['comment'];
            $count++;

            $this->get_news_comment($id_news, $level.".".$contador, $row['id_comment']);

      
            return $news;
        }
    }
    else
    {
       return null;
   }
}

----



2009/4/16 Cleyverson Costa <cleyver...@gmail.com>

felipebastos

unread,
Apr 17, 2009, 4:04:24 PM4/17/09
to LISTA PHP
vc criou um loop infinito
.
$this->get_news_comment($id_news, $level+1, $row['id_comment']);
.
o return $news; nunca será executado, e de quebra ainda vai estourar a
pilha :D
.
if (condicao) {
...return $news;
}
else $this->get_news_comment($id_news, $level+1, $row['id_comment']);
.
o return vindo primeiro elimina a ocorrência de recursão infinita,
visto que um valor será consumido antes de entrar na recursão ..
.
vc pode usar o $count para parar a recursão, basta saber com
antecedencia quantas vezes serão executadas.
ou vc pode parar, não havendo mais parents ..
.
como seu algoritmo ficou meio confuso (não entendi) .. só dá pra
comentar isso

felipebastos

unread,
Apr 17, 2009, 4:12:35 PM4/17/09
to LISTA PHP
observe outra coisa ..

...return $news;
}
else $this->get_news_comment($id_news, $level+1, $row['id_comment']);
.
pra que você retorna esse $news ?? ele ficou sem serventia ..
reescrevendo ..
........................
...return $news;
}
else $algumacoisa = $algumacoisa + $this->get_news_comment($id_news,
$level+1, $row['id_comment']);

fazalgocom($algumacoisa); kkkk
................................
é um exemplo clássico do uso de recurssão
Reply all
Reply to author
Forward
0 new messages