Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Loop para vários níveis


Edgard A Michel

Pergunta

Olá a todos do Forum.

Estou com o seguinte caso:

Tenho uma estrutura de clientes no banco de dados onde todo cliente possui um ID próprio e um ID de indicação. Isto é, o cliente de ID 5 foi indicado pelo cliente de ID 4 que por sua vez foi indicado pelo cliente de ID 3 e assim por diante.

A necessidade: Hoje eu tenho mais de 5 mil clientes e preciso apresentar/montar uma visualização em "árvore" da "rede" de indicação de cada cliente.

Exemplo:

1

- 2

- 3

- - 10

- - 15

- - - 54

- - - - 125

- 4

- - 16

O problema: Estou esbarrando na lógica/código/função a ser utilizada para formar essa "rede em árvore" uma vez que não sei quantos níveis de indicação um determinado cliente pode ter.

Alguém tem alguma sugestão?

Obrigado.

Editado por Edgard A Michel
Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

Bom dia, Edgard!

Também criei um software para este tipo de utilidade.

Na época o fiz em VB, mas o sentido é o mesmo para qualquer linguagem.

Numa rede segura, essa pirâmide terá de parar em algum momento.

Caso isso não ocorra, você pode criar um campo que defina a escada que existe, depois dele (ligado a ele).

Exemplo:

Ele tem um indicado - Degrau 1

Ele tem um indicado - que indicou outro - Escada 2........

Mas o importante é você saber criar uma metodologia que abrace as necessidades gerais, se não vai ter problema na frente.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Bom dia Endor!

Obrigado pelo retorno.

Então você sugere que eu coloque uma condicional para cada vez que o loop identificar um "filho", verificar se esse filho é "pai" de alguém?

Se for isso, ficou um pouco mais claro mesmo!

Mas qual seria a melhor estrutura de loop para isso? do...while ou foreach?

Grande abraço!

Link para o comentário
Compartilhar em outros sites

  • 0

Olá, Edgar!

Dentro da Escada Abaixo:

Se eu tenho alguém da minha cadeia indicando, vou ter vários parâmetros para analisar.

Essa pessoa está em que grau da meinha cadeia (grau será o nível abaixo de mim, exemplo:

Filho, Neto, Bisneto, Tataraneto.....)?

Veja a complexidade: assim como você tem lançar crédito para mim, oriundo desse indicado, terá que fazer os mesmos com aqueles de direito acima deste, bem como aqueles que estiverem acima de mim.

Para evitar problema para qualquer um da cadeia, sugiro que faça o seguinte:

1) Campo para determinar se os pais que irão receber créditos estão em condições de receber, ou seja, não existe nenhuma condição que se não preenchida impede a inserção do crédito;

2) Campo informando que grau de filho o referido pai tem;

3) Ao fazer um loop (pode ser o WHILE), analisa cada um dos pais envolvidos e altera o grau +1;

Qualquer dúvida, volte.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Endor e a todos do forum!

Eu consegui resolver o problema criando a classe a baixo.

<?php

class Rede
{
    private $nivel;
    private $subnivel = 0;
    //public $idpai;
    
    public function verifica_filho($idpai, $nivel, $subnivel){
        $sql = "SELECT id_distribuidor FROM tb_distribuidor 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);
        }
    }
    public function lista_filhos($nivel, $subnivel, $id2){
        $sql1 = "SELECT id_distribuidor, nm_nome FROM tb_distribuidor WHERE id_pai = $id2";
        $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";
            $this->verifica_filho($row1["id_distribuidor"], $nivel, $subnivel);
        }
    }
}
?>

Mas agora estou com um outro problema, por mais que eu mude o ID do cliente para verificar as indicações, o PHP me mostra apenas o ID que eu realizei os testes.

É como se faltasse algo para "matar" o objeto instanciado.

Sabe o que pode ser?

Muito obrigado.

Link para o comentário
Compartilhar em outros sites

  • 0

olhe as posições do parâmetros, na hora de chamar você está chamando da seguinte forma:

$rede = new Rede();
$rede->lista_filhos($idd, 0, 1);//$idd passa o ID do cliente a ser pesquisado.
porem na declaração está na seguinte ordem
public function lista_filhos($nivel, $subnivel, $id2){
        $sql1 = "SELECT id_distribuidor, nm_nome FROM tb_distribuidor WHERE id_pai = $id2";

onde sempre o ID procurado será o "1"

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...