Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    struttura ad albero con php

    ciao a tutti

    Ho un grosso problema dovrei creare una struttura ad albero che mostri l'albero genealogico di una famiglia e stamparla a video. Ad Esempio:

    alberto
    --giovanni
    ---- francesco
    --luca

    I dati li prendo da una tabella:

    figli ___ padre
    alberto ___
    giovanni ___ alberto
    luca ___ alberto
    francesco ___ giovanni

    Qualcuno mi può aiutare???
    bat

  2. #2
    Utente di HTML.it L'avatar di las
    Registrato dal
    Apr 2002
    Messaggi
    1,221
    secondo me anche a volerla semplificare al massimo ti servono come minimo 3 tabelle:

    persone
    tipiRelazione
    relazioni

    persone
    codice:
    id | nome | cognome | dataNascita | ecc...
    tipiRelazione
    codice:
    id| realzione
    --------------------------------------
    1| Padre
    2| Madre
    3| Marito
    ecc ...
    relazioni
    codice:
    id | idPersona1 | idPersona2 | idTipiRelazione
    Il calcolatore è straordinariamente veloce, accurato e stupido.
    L'uomo è incredibilmente lento, impreciso e creativo.
    L'insieme dei due costituisce una forza incalcolabile.
    (Albert Einstein)

  3. #3
    Tieni, molto rozzo ma fa al caso tuo:
    Codice PHP:
    <?php
    $connessione 
    mysql_connect("server""user""password") or die("Connessione non riuscita: " mysql_error());
    mysql_select_db('test',$connessione); 

    $result mysql_query("select id,nome from albero where padre=0",$connessione);

    // Check result
    // This shows the actual query sent to MySQL, and the error. Useful for debugging.
    if (!$result) {
        
    $message  'Invalid query: ' mysql_error() . "\n";
        
    $message .= 'Whole query: ' $query;
        die(
    $message);
    }

    while (
    $row mysql_fetch_assoc($result)) {
        echo(
    $row['nome']."
    "
    );
        
    StampaFiglio($row['id'],1);
    }
    mysql_free_result($result);
    mysql_close($connessione);

    function 
    StampaFiglio($idPadre,$Rientro){
        
    $connessione mysql_connect("server""user""password") or die("Connessione non riuscita: " mysql_error());
        
    mysql_select_db('test',$connessione); 

        
    $result mysql_query("select id,nome from albero where padre=".$idPadre,$connessione);

        
    // Check result
        // This shows the actual query sent to MySQL, and the error. Useful for debugging.
        
    if (!$result) {
            
    $message  'Invalid query: ' mysql_error() . "\n";
            
    $message .= 'Whole query: ' $query;
            die(
    $message);
        }

        while (
    $row mysql_fetch_assoc($result)) {
            echo(
    str_repeat("-",$Rientro)." ".$row['nome']."
    "
    );
            
    StampaFiglio($row['id'],$Rientro+1);
        }
        
    mysql_free_result($result);
        
    mysql_close($connessione);
    }
    ?>
    Presuppone che esista la tabella albero nel db test e che sia composta da id (int primary key autoincrement), nome (varchar), padre (int not null, default 0).

    padre a 0 è ovviamente indica che l'elemento non ha padri, mettere invece l'id del padre se ce l'ha:

    (1)alberto->0
    (2)giovanni->1
    (3)luca->1
    (4)francesco->2

    Ecco la struttura della tabella:
    codice:
    CREATE TABLE `albero` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `nome` varchar(255) NOT NULL,
      `padre` int(11) NOT NULL DEFAULT '0',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
    
    -- 
    -- Dump dei dati per la tabella `albero`
    -- 
    
    INSERT INTO `albero` (`id`, `nome`, `padre`) VALUES 
    (1, 'alberto', 0),
    (2, 'giovanni', 1),
    (3, 'luca', 1),
    (4, 'francesco', 2);

  4. #4
    Grazie mille adesso ci provo e dopo vi faccio sapere
    bat

  5. #5
    Originariamente inviato da las
    secondo me anche a volerla semplificare al massimo ti servono come minimo 3 tabelle:
    anche qualcosa in più, anche perchè con una struttura come quella di batman, ad esempio, non si può fare la relazione marito/moglie e quindi neanche dire che un figlio ha un padre e una madre....
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  6. #6
    Se non ho capito male tu vuoi creare un albero.

    Se il numero di livelli è fisso (ad. esempio una struttura padre - figli - sottofigli possiede tre livelli) la cosa si presenta abbastanza semplice strutturandola in più tabelle.

    Ma se il numero di livelli non è noto entra in gioco una particolare tecnica (che conosco vagamente ma nn ho mai adottato) detta Nested Set Model (http://en.wikipedia.org/wiki/Nested_set_model) che sul web puoi anche trovare con il nome di hierarchical data.
    Ebbene questi metodi prevedono UNA SOLA TABELLA!
    http://www.miniscript.it
    Se ti sono stato di aiuto in qualche modo in questo forum iscriviti alla fan page di Miniscript - il mio blog di programmazione web.

  7. #7
    Originariamente inviato da oly1982
    Se non ho capito male tu vuoi creare un albero.

    Se il numero di livelli è fisso (ad. esempio una struttura padre - figli - sottofigli possiede tre livelli) la cosa si presenta abbastanza semplice strutturandola in più tabelle.

    Ma se il numero di livelli non è noto entra in gioco una particolare tecnica (che conosco vagamente ma nn ho mai adottato) detta Nested Set Model (http://en.wikipedia.org/wiki/Nested_set_model) che sul web puoi anche trovare con il nome di hierarchical data.
    Ebbene questi metodi prevedono UNA SOLA TABELLA!
    quella struttua è un esempio di albero ottimizzato soprattutto nei casi uno non abbia database che supportano query recursive. Non so l'ultima versione di MySql, ma ad esempio PostgreSql supporta query recursive e quindi basta una tabella padre-figlio. Resta sempre il problema che se quello vuole fare un albero genealogico deve avere anche relazioni sullo stesso livello, ovvero marito/moglie, altrimenti non riesci a fare l'albero genealogico esatto ma solo un suo sottoinsieme
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  8. #8
    Originariamente inviato da Santino83_02
    quella struttua è un esempio di albero ottimizzato soprattutto nei casi uno non abbia database che supportano query recursive. Non so l'ultima versione di MySql, ma ad esempio PostgreSql supporta query recursive e quindi basta una tabella padre-figlio. Resta sempre il problema che se quello vuole fare un albero genealogico deve avere anche relazioni sullo stesso livello, ovvero marito/moglie, altrimenti non riesci a fare l'albero genealogico esatto ma solo un suo sottoinsieme
    Come db conosco solo mysql e non sò in cosa consistono le query recursive (però intuisco basandomi sulle funzione recursive di php).

    Effettivamente quella tecnica non consente di fare relazioni orizontali (si chiamano così... insomma quello fra due elementi di uno stesso livello).
    http://www.miniscript.it
    Se ti sono stato di aiuto in qualche modo in questo forum iscriviti alla fan page di Miniscript - il mio blog di programmazione web.

  9. #9
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    una tabella

    id | name | parent_id


    a me sembra sufficente... ti crei l'oggetto Person e ne calcoli i genitori (parents)

    dopo rimane solo il discorso di annidarli, ma quando hai già le dipendenze fatte è un gioco di ricorsioni e while.

    diciamo che il lavoro se lo smazza il codice, e il db fa il suo... mantenere i dati
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  10. #10
    Utente di HTML.it L'avatar di las
    Registrato dal
    Apr 2002
    Messaggi
    1,221
    Originariamente inviato da dottwatson
    una tabella

    id | name | parent_id
    supponiamo che Mario sia il figlio di Antonio e Giovanna, come fai a segnare questa relazione? si è vero che potresti duplicare la riga di mario e poi come hai detto tu far fare tutto al codice .... però io sono dell'idea che se si fa il DB il più fedele possibile a ciò che vogliamo ottenere (in questo caso un Albero Genealogico) poi ti ritrovi la vita molto semplificata quando scrivi il codice.

    Il calcolatore è straordinariamente veloce, accurato e stupido.
    L'uomo è incredibilmente lento, impreciso e creativo.
    L'insieme dei due costituisce una forza incalcolabile.
    (Albert Einstein)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.