Autor Zpráva
Václav N.
Profil *
Zdravím,

mám takovýto kód

$pole = array(
                array('id'=>1, 'title'=>"Filmy", 'id_up'=>0, 'pos'=>1),
                array('id'=>2, 'title'=>"Drama", 'id_up'=>1, 'pos'=>1),
                array('id'=>3, 'title'=>"Horor", 'id_up'=>1, 'pos'=>3),
                array('id'=>4, 'title'=>"Krimi", 'id_up'=>1, 'pos'=>2),
                array('id'=>5, 'title'=>"Komedie", 'id_up'=>1, 'pos'=>4),
                array('id'=>6, 'title'=>"Seznamka", 'id_up'=>0, 'pos'=>2),
                array('id'=>7, 'title'=>"Muzi", 'id_up'=>6, 'pos'=>2),
                array('id'=>8, 'title'=>"Zeny", 'id_up'=>6, 'pos'=>1),
                array('id'=>9, 'title'=>"Auta", 'id_up'=>0, 'pos'=>3),
                array('id'=>10, 'title'=>"Sportovni", 'id_up'=>9, 'pos'=>1),
                array('id'=>11, 'title'=>"Luxusni", 'id_up'=>9, 'pos'=>4),
                array('id'=>12, 'title'=>"Nakladni", 'id_up'=>9, 'pos'=>2),
                array('id'=>13, 'title'=>"Osobni", 'id_up'=>9, 'pos'=>3),
                array('id'=>14, 'title'=>"Domaci", 'id_up'=>13, 'pos'=>1),
                array('id'=>15, 'title'=>"Skoda", 'id_up'=>14, 'pos'=>1),
                array('id'=>16, 'title'=>"Zahranicni", 'id_up'=>13, 'pos'=>2),
                array('id'=>17, 'title'=>"Audi", 'id_up'=>16, 'pos'=>3),
                array('id'=>18, 'title'=>"BMW", 'id_up'=>16, 'pos'=>2),
                array('id'=>19, 'title'=>"Toyota", 'id_up'=>16, 'pos'=>1),
                array('id'=>20, 'title'=>"Jukebox", 'id_up'=>0, 'pos'=>4)
              );
              

$novePole = array ();

foreach ( $pole as $detail ) {

    $novePole [$detail['id_up']][$detail['pos']] = array ( 'id'    =>    $detail['id'], 'title' =>    $detail['title'] );
    
    ksort ( $novePole[$detail['id_up']] );
    
}


function strom ( $pole, $otec = 0, $param = '') 
{

    foreach ( $pole[$otec] as $id => $jeden ) 
    {


        $link = $param . ','.$jeden['id'];
        echo '<ul><li><a href="?id='.$link.'">' . $jeden['title'] . '</a></li>';
        
        if ( ( isset ( $pole[$jeden['id']] ) ) && ( count ( $pole[$jeden['id']] ) > 0 ) ) strom ( $pole, $jeden['id'], $link );
        
        echo '</ul>';
        
    }
    
}

strom ( $novePole );

Pokud zavolám tu funkci strom, vypíše se mi rekurzivně celý strom, to je v pořádku a funguje, přes parametr $param jsem si dodělal odkazy v jednotlivých uzlech tak, aby se nabalovaly jednotlivé nadražené položky, takže když jsem např. ve 3 úrovni tak mám odkaz typu ?id=7,8,15 (rodič 8, jeho rodič 7 a konrétní položka 15).

Nicméně jsem se dostal do situace, kvůli jistému vlastnímu frameworku, že nemohu použít funkci ale musím vkládat pouze část php fragmentu do sebe.

Je to tedy takto

$otec = 0;
$pole = $novePole;
$param = '';
include 'rekurzeTPL.php';

a já se snažím vymyslet jak plnit ten odkaz, aby to fungovalo jako když to volám přes funkci, nejde mi to :-(((
rekurzeTPL.php
<?

    if (isset($pole[$otec]))
    {

        foreach ( $pole[$otec] as $id => $jeden ) 
        {

            $link = $link . $param . ','.$jeden['id'];
            $tmp = $param . ','.$jeden['id'];
            echo '<ul><li><a href="?id='.$link.'">' . $jeden['title'] . '</a></li>';
            
            if ( ( isset ( $pole[$jeden['id']] ) ) && ( count ( $pole[$jeden['id']] ) > 0 ) ) 
            {
     
                $otec = $jeden['id'];
                $link = $tmp;
                include 'rekurzeTPL.php';
            }
            
            echo '</ul>';
            
        }


    }

Byl by někdo tak laskav a upravil by mi to?
Alphard
Profil
Výhoda funkce je v tom, že oddělí lokální proměnné pro jednotlivá spuštění. Přes include to fungovat nebude, protože se proměnné nasdílí a rozbije se to, to jste už zjistil. Musel byste simulovat chování fce, tj. jednotlivé proměnné pro každou iteraci ukládat do dalšího pole.

Co si třeba rekurzivně sestavit strom (tj. setřídit položky a u každé určit velikost zanoření) a pak jednoduše vypsat? Bylo by to lepší než takže patlat html výpisy do složitějších php funkcí.
Václav N.
Profil *
Alphard:
O to se snažím, nasimulovat chování funkce a nějak to oddělit, leč na to nemohu přijít.
To druhé neřeší ten problém. Je to až tak složité, že nikdo neví? Já jsem znalostmi mírně pokročilý, a co tak sleduji někdy, vím, že tu jsou chytří lidé, jmenovat nebudu. Asi o to není zájem nebo skutečně nikdo neví @:-)
Jan Tvrdík
Profil
Václav N.:
Nechápu, proč je problém uvnitř rekurzeTPL.php deklarovat (třeba jako anonymní funkci) tu funkci strom a následně ji zavolat. Jinak samozřejmě lze tu rekurzi přepsat na iteraci.
Kcko
Profil
Tohle by mělo fungovat (resp. funguje, zkoušel jsem to). Možná se to dá napsat úsporněji / či na oko líbivěji, nevím, rekurze a věci podobného rázu mi nikdy nijak zvlášt nešly.

    if (isset($pole[$otec]))
    {

        if(!isset($parents))
            $parents = array();
        else
            $parents[] = $otec;

        foreach ( $pole[$otec] as $id => $jeden ) 
        {
           
            $tmp   = $parents;
            $tmp[] = $jeden['id'];
            $link = implode(',', $tmp);


            echo '<ul><li><a href="?id='.$link.'">' . $jeden['title'] . '</a></li>';
            
            if ( ( isset ( $pole[$jeden['id']] ) ) && ( count ( $pole[$jeden['id']] ) > 0 ) ) 
            {
     
                $otec = $jeden['id'];
       
                include 'rekurzeTPL.php';
            }
            
            echo '</ul>';
            
        }

        array_pop($parents);


    }

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: