1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[PHP] Função recursiva

Discussão em 'Web Development' iniciada por iMP-, 29 de Maio de 2008. (Respostas: 9; Visualizações: 1641)

  1. Boas! estou a fazer um catalogo... mas para adicionar produtos nesse catalogo precisava de uma combobox do seguinte genero:


    Computadores
    ____- Desktops
    _______- Pretos
    _______- Brancos
    ____- Portateis
    _______- Castanhos

    (os underscores é só pq nao da espaço)
    Tenho isto tudo introduzido na base de dados, não sei como fazer para mostrar dessa forma....

    alguma sugestão?
     
  2. hostmake

    hostmake Power Member

    Exemplo base dados (tabela: lista_produtos)

    id | id_mae | nome_produto

    Exemplo de 3 prdoutos

    1 | 0 | Motherboards
    2 | 1 | DFI
    3 | 0 | Processadores


    PHP:
    $categorias_mae MYSQL_QUERY("SELECT * FROM lista_produtos WHERE id_mae='0'");
    Enquanto corres o array dos dados do while, ex.

    PHP:
    while ($d mysql_fetch_assoc($categorias_mae)) {

    $sub_categorias MYSQL_QUERY("SELECT * FROM lista_produtos WHERE id_mae='".$d['id']."'");

    }

    É claro que por esta altura dava jeito, criares uma funcao que verifique se existem, e que faca o select até ao fim das categorias.
     
  3. A base de dados ja esta feita, ja mostra o catalogo, so que eu ao mostrar o catalogo tenho por ex Computadores e tenho que clicar para me aparecer os filhos, o que eu pretendo é uma combobox que me mostre por ordem?
    Pai(1)
    _filho(1)
    __neto(1)
    _filho(1)
    Pai(2)
    _filho(2)
    _filho(2)

    se é que me faço entender
     
  4. slack_guy

    slack_guy Power Member

    Tens a solução do OPTGROUP (http://www.w3schools.com/tags/tag_optgroup.asp - que eu penso que não faça os 3ºs níveis, mas não tenho a certeza) e tens a solução dos espaços:
    Código:
    <html>
        <head>
            <title>combo</title>
        </head>
        <body>
            <select name='tree'>
                <option>Pai 1</option>
                <option>&nbsp;&nbsp;&nbsp;Filho 1.1</option>
                <option>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Neto 1.1.1</option>
                <option>&nbsp;&nbsp;&nbsp;Filho 1.2</option>
                <option>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Neto 1.2.1</option>
                <option>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Neto 1.2.2</option>
                <option>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Neto 1.2.3</option>
                <option>Pai 2</option>
                <option>&nbsp;&nbsp;&nbsp;Filho 2.1</option>
                <option>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Neto 2.1.1</option>
            </select>
        </body>
    </html>
    
     
  5. MPalhas

    MPalhas Power Member

    a solução do optgroup era o que lhe ia sugerir á bocado, mas testei e só funciona com um nível. quando se tenta por uma dentro aparecem como 2 níveis diferentes.
    vai ter que ser mesmo com espaços e com uma verificação para impedir de clicar nos supostos títulos

    mas acho que é melhor dares mais pormenores, tipo como está estruturada essa parte da base de dados. as secções pai estão na mesma tabela das secções filho e por ai adiante ou estão em tabelas diferentes. se estão em diferentes como é as associaste, etc
     
    Última edição: 29 de Maio de 2008
  6. [​IMG]

    a 1ª é a minha tabela a 2ª será a minha combo box pretendida, algo do genero...
     
  7. hostmake

    hostmake Power Member

    Eu dei-te o código.. e serve para isso, a maneira como tu fazes echo é contigo, quantos espaços, ou traços metes tambem..
     
  8. p3dro

    p3dro Power Member

    Pegando nas ideias do slack_guy e do hostmake vê se isto te ajuda em alguma coisa:


    PHP:
    <?php
    //construir dropdown
    function BuildDDList(){
      return 
    "<select name='ddListOptions'>"._BuildDDListItems()."</select>";
    }

    //construir item da dropdown
    function _BuildDDListItems($parent=0$level=0$db_cnn=null){
      
    $indent "";
      if(!
    $db_cnn){$db_cnn=_connectDB();} 

      for (
    $i=0$i<$level$i++){
        
    $indent.= "&nbsp; &nbsp;"//fazer indentação com 3 espaços
      
    }

      
    $sql mysql_query("Select `id`,`nome` From `lista_produtos` Where `pai`='$parent'",$db_cnn);
      while (
    $myrow mysql_fetch_array($sql)){
        
    //menu root não tem prefixo
        
    $prefix=($level>0)?"-&nbsp;":"";
        
    //construir item
        
    $items.="<option value='$myrow[id]'>$indent$prefix$myrow[nome]</option>";
        
    //chamar recursivamente a função
        
    $items.=_BuildDDListItems($myrow["id"], $level+1,$db_cnn);
      }

      return 
    $items;
    }

    //ligação à BD
    function _connectDB(){
      
    $db mysql_connect("localhost""root""");
      
    mysql_select_db("my_database",$db) or die("Impossivel aceder à BD");
      return 
    $db;
    }


    //imprimir dropdown
    echo BuildDDList();
     
  9. spastikman

    spastikman Banido

    podes é não usar uma combobox, e podes usar uma treeview (tens disto já feito em javascript).
     
  10. Pedro era mesmo isso! es o maior carai! xD obrigadao!
    obrigado a todos pela ajuda
     

Partilhar esta Página