sábado, 19 de novembro de 2011

PHP – Funções Recursivas


Hello World!

Aqui eu vou apresentar um caso que me deu um certo trabalho. Trata-se de uma classe usada para listar “Filhos” e os “Filhos dos Filhos” até onde forem.

Eu tive essa demanda em um sistema no qual usuários indicavam novos usuários e deveria ser apresentado uma lista com a “rede de indicados” de um determinado usuário indicante.

Segue a classe em PHP com consulta a um banco de dados MySql.

Obs: Eu não vou postar o código de conexão com o banco de dados, isso pode ser facilmente encontrado no internet.

<?php
class Rede
{
private $nivel; //Esta variavel é usada para enumerar todos os listados
private $subnivel = 0; //Esta variavel server para referenciar o pai dos listados em qualquer nível

public function verifica_filho($idpai, $nivel, $subnivel){//Função que verifica se o usuário que esta sendo listado possui filho(s) $sql = "SELECT id_usuario FROM tb_usuarios WHERE id_pai = $idpai"; $res = mysql_query($sql) or die ("Erro na Query: $sql"); if(mysql_num_rows($res) != ""){ $subnivel = $this->$nivel; $this->lista_filhos($nivel, $subnivel,$idpai); //Chama a função que lista os filhos caso o usuário tenha filhos } }//Se o usuário não tiver filhos, retorna ao loop anterior public function lista_filhos($nivel, $subnivel, $id2){ $sql1 = "SELECT id_usuario, nm_nome FROM tb_usuarios WHERE id_pai = $id2";//Lista os filhos do usuário $res1 = mysql_query($sql1) or die ("Erro na Query: $sql1"); while($row1 = mysql_fetch_array($res1)) { $this->$nivel++; echo "d.add(", $this->$nivel, ",", $subnivel, ",'", $row1["nm_nome"], "');\n";//Escreve o ID (nivel) + nome do usuário
$this->verifica_filho($row1["id_distribuidor"], $nivel, $subnivel); //Chama a função que verifica se o usuário possui filhos } } }#Fim da classe
?>


Esse é um exemplo de funções recursivas, que uma função chama a outra em um loop e é encerrada quando uma das condições não é atendida.

O mais facinante é que o PHP consegue “lembrar” de onde parou e voltar a execução a partir do ID que iniciou um loop.

Comentários e sugestões serão bem vindos!

Nenhum comentário:

Postar um comentário