Moikka,
Olisiko jollakulla tiedossa hyvää koodipätkää, jolla haetaan monitasoista puuhakemistoa (valikkoa). Ajatuksena niin, että voisi määritellä hakemiston tason jotka näkyvät valikossa.. (esim. otsikko 1, otsikko 1.1. otsikko 1.1.1)
mallilla-> ID, nimi, parent
katselin tuossa googlella kaikenlaisia koodipätkiä, mutta ei osunut silmään sellaista joka olisi muokkautunut omasta toimesta omaan käyttöön sopivaksi.
Valmista koodipätkää tuskin kellään on tähän suoraan heittää, mutta juuri kuten kerroit.
Rivitietona vaan, jossa rivillä on tieto isäntärivistä (0 taso esim. juuri), lisäksi ylimääräisiä apukenttiä, jos haluat näkyvyyttä säädellä haluamallasi tavalla.
Jos kannassa on juuritaso niin sen numerolla ei ole erityisempää merkitystä. Jos juuritasolle ei ole omaa tietuetta kannassa, niin silloin se olisi mielestäni loogisemmin null kuin 0. Vierasavainkin toimii siinä tapauksessa.
Grez kirjoitti:
Jos kannassa on juuritaso niin sen numerolla ei ole erityisempää merkitystä. Jos juuritasolle ei ole omaa tietuetta kannassa, niin silloin se olisi mielestäni loogisemmin null kuin 0. Vierasavainkin toimii siinä tapauksessa.
Totta turiset
Jos juurisolmu ei ole tietokannassa (kuten ei ehkä olekaan, jos yksittäistä juurta ei haluta tulostaa vaan alimmallakin tasolla on monta solmua), puun muodostaminen datasta tapahtuu tähän malliin:
// Haetaan kaikki solmut taulukkoon ID:n mukaan. $nodes = []; foreach (sql("SELECT * FROM tree") as $row) { $node = new Node($row); $nodes[$node->id] = $node; } // Luodaan juurisolmu. $root = new Node(); // Liitetään solmut puuksi. foreach ($nodes as $node) { if ($node->parent_id) { $nodes[$node->parent_id]->children[] = $node; } else { $root->children[] = $node; } }
Jos juurisolmu on myös tietokannassa, koodi muuttuu näin:
// Haetaan kaikki solmut taulukkoon ID:n mukaan. $nodes = []; foreach (sql("SELECT * FROM tree") as $row) { $node = new Node($row); $nodes[$node->id] = $node; // Juurisolmu on se, jolla ei ole vanhempaa. if (!$node->parent_id) { $root = $node; } } // Liitetään solmut puuksi. foreach ($nodes as $node) { if ($node->parent_id) { $nodes[$node->parent_id]->children[] = $node; } }
Tulostus onnistuu rekursiolla:
function output($nodes) { echo "<p>Tree:</p>\n"; $f = function($nodes) use(&$f) { if ($nodes) { echo "<ul>"; foreach ($nodes as $node) { echo "<li>", htmlspecialchars($node->text); $f($node->children); echo "</li>\n"; } echo "</ul>\n"; } }; return $f($nodes); } output($root->children);
Nämä koodit toimivatkin suoraan, kun vielä lisätään alkuun kokeilua varten laadittu Node-luokka ja sql-funktio:
class Node { public $children = []; public function __construct($data = []) { foreach ($data as $i => $j) $this->$i = $j; } } function sql() { for ($i = 1; $i <= 40; ++$i) { yield ["id" => $i, "text" => $i, "parent_id" => intval(($i + 1) / 3)]; } }
Eikö toimi? Päivitä PHP tai muuta koodista uudet rakenteet (lyhyt taulukkomerkintä, nimetön funktio ja yield-lausetta käyttävä generaattorifunktio) vanhemmalla versiolla toimiviksi rakenteiksi.
Tässä on yksi viritys jota oon käyttänyt. Toivottavasti on apua.
<?php $server="host"; $username="user"; $password="salasana"; $connect_mysql=mysql_connect($server,$username,$password) or die ("Connection Failed!"); $mysql_db=mysql_select_db("kanta",$connect_mysql) or die ("Could not Connect to Database"); $query = "SELECT * FROM kanta2"; $result=mysql_query($query) or die("Query Failed : ".mysql_error()); $i=0; while($rows=mysql_fetch_array($result)) { $roll[$i]=$rows['NIMI']; //// anna tähän sarakkeen nimi $i++; } $total_elmt=count($roll); ?> <form method="POST" action=""> hakuja hakuja;: <select name="sel"> <option>Valitse</option> <?php for($j=0;$j<$total_elmt;$j++) { ?><option><?php echo $roll[$j]; ?></option><?php } ?> </select> <input name="submit" type="submit" value="etsi"/><br /> </form> <p> <?php if(isset($_POST['submit'])) { $value=$_POST['sel']; $query2 = "SELECT * FROM kanta2 WHERE NIMI='$value'"; $result2=mysql_query($query2) or die("Query Failed : ".mysql_error()); while($row=mysql_fetch_array($result2)) { Tästä eteenpäin tulostusta
Kiitos !
testailen noita vinkkejä
Aihe on jo aika vanha, joten et voi enää vastata siihen.