Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Puurakenne PHP:llä

Hoover [10.08.2007 16:15:34]

#

Mitenkä voisin tulostaa sellaisen taulukon, jonka rakenne on todella heikosti määrätty etukäteen. Oikeastaan muuta taulukosta ei tiedetä varmaksi kuin että siinä on juuri.

Tarkoitan siis tämän tyylistä taulukkoa:

$alitaso1 = array("Juupatijuu", "Jepsistä joo");
$alitaso2 = array("Hilipatihippa");

$juuri[] = $alitaso1;
$juuri[] = $alitaso2;

Taulukko voisi myös haaraantua ihan mistä tahansa, vaikka alitaso2:sta lähtisi 3 alihaaraa lisää.

Esimerkin taulukko pitäisi saada tässä muodossa ruudulle, sisentäen aina rivejä sitä mukaan, mitä syvempi taso se on:

Juuri
     Alitaso 1:n arvot tällä rivillä
          Tällä rivillä voisi taas olla alitaso1:n ensimmäinen alitaso
          Tällä rivillä voisi olla alitaso 1:n toinen alitaso

     Alitaso 2:n arvot tällä rivillä

Melko sekava kysymys varmaan, mutta jospa tuo selviäisi. ;)

Antti Laaksonen [10.08.2007 16:36:41]

#

Tarkoitatko tällaista mekanismia?

<?php

function tulosta($puu, $syvyys) {
    foreach($puu as $lehti) {
        if (is_array($lehti)) {
            tulosta($lehti, $syvyys + 1);
        } else {
            echo str_repeat("\t", $syvyys);
            echo $lehti . "\n";
        }
    }
}

$taso1 = array("TASO 1", "avain", "banjo");
$taso21 = array("TASO 2:1", "cembalo", "donitsi", "etana");
$taso22 = array("TASO 2:2", "fakiiri");
$taso2 = array("TASO 2", $taso21, "gepardi", $taso22);
$juuri = array("JUURI", $taso1, $taso2);

echo "<pre>";
tulosta($juuri, 0);
echo "</pre>";

?>

Esimerkin tulostus:

JUURI
	TASO 1
	avain
	banjo
	TASO 2
		TASO 2:1
		cembalo
		donitsi
		etana
	gepardi
		TASO 2:2
		fakiiri

Rekursiivinen funktio on todella näppärä tällaisten puurakenteiden käsittelyssä.

Hoover [10.08.2007 17:19:02]

#

Tuo muuten voisi olla suunnilleen mitä haen. Kiitti! :)

Hoover [13.08.2007 15:25:20]

#

Noniin, nyt tuli vielä samantapainen kysymys mieleen, joten pistetään jatkoa tähän samaan ketjuun vaikka.

Eli mitenkä voisin koota dynaamisesti tällaisen puurakenteisen taulun, jonka Antti tuossa ylempänä neuvoi?

Minulla on käytettävissä taulukkoja, joiden sisällä on tauluja. Nämä pitäisi saada jossain luupissa menemään juuritauluun niin, että aina uusi taulu lisätään alhaisimpaan tauluun jatkeeksi.

Alla on vielä kuvaus tilanteesta:

$tauluja[] = $jokutaulukko1;
$tauluja[] = $jokutaulukko2;
// ... näitä vaikka kymmenen ihan samanlailla

$taulupuu;
for ($i=0; $i<count($tauluja); $i++)
{
     // $taulupuu = ?
     // Tässä pitäisi kerätä taulut niin, että uusi taulu tulee aina viimeksi lisätyn taulun alitauluksi
}

Eli lopputuloksen pitäisi olla tämän tyylinen:

taulupuu
     jokutaulukko1
          jokutaulukko2
               // ...

Antti Laaksonen [13.08.2007 20:54:27]

#

Luo puurakenne tällä tavalla:

$taulut[] = array("avain");
$taulut[] = array("banjo");
$taulut[] = array("cembalo");
$taulut[] = array("donitsi");

$taulut = array_reverse($taulut);

$juuri = array();
foreach($taulut as $taulu) {
    $juuri = array_merge($taulu, array($juuri));
}

Tässä puuta aletaan koota alimmasta tasosta lähtien, minkä vuoksi taulukko täytyy kääntää aluksi.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta