Autor Zpráva
nethor
Profil
Zdravím,
mám setříděné dvourozměrné pole, př:
$pole[] = array("Automobily","Osobní","Autorádia");
$pole[] = array("Automobily","Osobní","Bouračky");
$pole[] = array("Automobily","Užitkové","Dodávky");
$pole[] = array("Hudba & film","DVD");
a potřebuji ho inteligentně vypsat do seznamu:
(přeskočit duplicitní nadřazené položky)
<ul>    
    <li>Automobily
        <ul>    
            <li>Osobní
                <ul>    
                    <li>Autorádia</li>
                    <li>Bouračky</li>
                </ul>    
            </li>    
            <li>Užitkové
                <ul>    
                    <li>Dodávky</li>
                </ul>
            </li>    
        </ul>
    </li>    
    <li>Hudba & film
        <ul>    
            <li>DVD</li>
        </ul>    
    </li>
</ul>
Zkouším to přes vnořený foreach() , ale ne a ne to rozchodit, už se s tím trápím celý den.
Možná to jde úplně jednoduše, nevíte někdo jak na to?
joe
Profil
Jednoduše by se to mělo dát vypsat rekurzí, hádám, že jsem ti ale asi moc nepomohl. Každopádně osobně bych formát pole trochu pozměnil, protože by se mi s tím lépe pracovalo, a to konkrétně na (pokud jsem se někde nespletl):
$pole[] = array("Automobily" => array("Osobní" => array("Autorádia", "Bouračky"), "Užitkové" => array("Dodávky")));
$pole[] = array("Hudba & film","DVD");
Ugo
Profil
tohle zrovna spolehlivě a rozšiřovatelně nevidím, nebylo by možné připravit si lepší pole?
$pole['automobily']['osobni'][]="autoradia";
$pole['automobily']['osobni'][]="bouračky";

Edit:ha byl jsem přeskočen :)
nethor
Profil
Tohle tak nějak chodí, ale má to kosmetické vady:

$cesta[] = array("Automobily","Osobní","Autorádia");
$cesta[] = array("Automobily","Osobní","Bouračky");
$cesta[] = array("Automobily","Užitkové","Dodávky");
$cesta[] = array("Hudba & film","DVD");


$last = array();

foreach ($cesta as $ind => $kat) {
    foreach ($kat as $uroven => $polozka) {
        if($last[$uroven] != $polozka) { //    předchozí úroveň se liší        
            if($ulend = $open - $uroven ) $echo[] = str_repeat("</ul>", $ulend);
            $open = $uroven;
            $echo[] = str_repeat("\t", $uroven)."<ul>"; $open ++;                 
            $echo[] = str_repeat("\t", $uroven+1)."<li>$polozka" ;    // když se liší, položka se vypíše vždy
            }
        $last[$uroven] = $polozka;
         }    
    }
$echo[] = str_repeat("</ul>", $open) ;     // uzavřem zbytek

if (is_array($echo)) echo implode("\n", $echo);

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: