Autor Zpráva
pole
Profil *
Dobrý den,

Mám následující kód:
        $pole=array('jedna'=>array('a','b','c','d'),'dva','tri','ctyri'=>array('a','b'));        
        foreach ($pole as $cislo)
          {
          echo '<li>'.$cislo;
          echo '<ul>';
          foreach ($cislo as $pismenko)
            {
            echo '<li>'.$pismenko.'</li>';
            }
          echo '</ul>';
          }
a chci ho vypsat takto:
        <li>jedna
           <ul>
            <li>a</li>
            <li>b</li>
            <li>c</li>
            <li>d</li>
          </ul>
        </li>
        <li>dva</li>
        <li>tri</li>
        <li>ctyri
           <ul>
            <li>a</li>
            <li>b</li>
          </ul>
        </li>
ale vypisuje se takto:
        <li>Array
           <ul>
            <li>a</li>
            <li>b</li>
            <li>c</li>
            <li>d</li>
          </ul>
        </li>
        <li>dva</li>
        <li>tri</li>
        <li>Array
           <ul>
            <li>a</li>
            <li>b</li>
          </ul>
        </li>
kde mám chybu?
juriad
Profil
To proto, že v li na 4. řádku musíš vypast v připadě vnořeného pole klíč a ne hodnotu. Trochu jsem to zobecnil:

function printRecursiveArray($pole) {
    echo "<ul>\n";
    foreach ($pole as $key => $value) {
        echo "<li>";
        if (is_array($value)) {
            echo $key, "\n";
            printRecursiveArray($value);
        } else {
            echo $value;
        }
        echo "</li>\n";
    }
    echo "</ul>\n";
}

printRecursiveArray($pole);
pole
Profil *
no ono je to trošku složitější ten kód, sem jsem ho napsal zjednodušeně, nakopl jsi mě správným směrem, ale stejně nedokážu udělat to, co chci
kód vypadá takto:
       <ul>
       <?php
       $pole=array('odkaz'=>array('položka','položka','položka','položka'),'odkaz'=>array('položka','položka'),'odkaz','odkaz','odkaz'=>array('položka','položka','položka'),'odkaz','odkaz'=>array('položka','položka','položka'),'odkaz'=>array('položka','položka','položka'),'odkaz'=>array('položka','položka','položka'));
        foreach ($pole as $key=>$value)
          {
          if (is_array($value))
            {
            echo '<div class="odkaz"><li><a href="">'.$key.'</a>';
            echo '<ul>';
            foreach ($value as $value)
              {
              echo '<li><a href="">'.$value.'</a></li>';
              }
            echo '</ul></li></div>';
            }
          else
            {
            echo '<div class="odkaz"><li><a href="">'.$value.'</a></li></div>';
            }
          }
       ?>
       </ul>
ještě je potřeba dovnitř ifu doplnit něco, aby to vypsalo všechny hodnoty
juriad
Profil
pole:
V seznamech nemá <div> co dělat. A kde chceš vzít ty adresy? To podle mě musíš změnit tu definici pole. To foreach ($value as $value) je přece blbost, proměnná se musí jmenovat jinak.

$menu =
array(
    array('name' => 'jedna', 'submenu' =>
        array(
            array('name' => 'a', 'href' => 'http://a/'),
            array('name' => 'b', 'href' => 'http://b/'),
            array('name' => 'c', 'href' => 'http://c/'),
            array('name' => 'd', 'href' => 'http://d/')
        )
    ),  
    array('name' => 'dva', 'href' => 'http://dva/'),
    array('name' => 'tri', 'href' => 'http://tri'),
    array('name' => 'ctyri', 'submenu' => 
        array(
            array('name' => 'a', 'href' => 'http://a/'),
            array('name' => 'b', 'href' => 'http://b/')
        )
    )
);  

function printRecursiveArray($menu) {
    echo "<ul>\n";
    foreach ($menu as $li) {
        echo "<li>";
        if (isset($li['href'])) {
            echo "<a href=\"" . $li['href'] . "\">". $li['name'] . "</a>";
        } else {
            echo "<span>". $li['name'] . "</span>";
        }

        if (isset($li['submenu'])) {
            echo "\n";
            printRecursiveArray($li['submenu']);
        }
        echo "</li>\n";
    }
    echo "</ul>\n";
}

printRecursiveArray($menu);
tiso
Profil
pole: tvoj i juriad-ov kód funguje, len musíš mať unikátne kľúče v tom poli, ty si ich v definícii prepisuješ:
$pole=array(
    'odkaz'=>array('položka1','položka','položka','položka'),//toto pole bude postupne prepisane
    'odkaz'=>array('položka2','položka'),
    'odkaz',//0
    'odkaz',//1
    'odkaz'=>array('položka3','položka','položka'),//vsetkymi
    'odkaz',//2
    'odkaz'=>array('položka4','položka','položka'),//tu
    'odkaz'=>array('položka5','položka','položka'),//dolu
    'odkaz'=>array('položka6','položka','položka')//posledne zostane
);

//vysledne pole:
$pole=array(
    'odkaz'=>array('položka6','položka','položka')
    'odkaz',//0
    'odkaz',//1
    'odkaz',//2
);
pole
Profil *
aha
ještě se zeptám: vyplatí se to vůbec dělat takto přes pole? já jsem to chtěl udělat, abych nemusel 9x kopírovat to stejný a aby byl kód přehlednější a kratší
nelituji toho času, který jsem nad tím strávil, dost jsem se toho naučil :)

juriad:
V seznamech nemá <div> co dělat.
ok, zkusím to ještě pořešit
Alphard
Profil
pole:
vyplatí se to vůbec dělat takto přes pole?
Máte oddělenou obsahovou složku (názvy, odkazy) od vzhledové, to je výhoda, je to obecnější. Už chybí jen krok k tomu, aby se načítalo dynamické menu z databáze.
Jestli to má smysl pro konkrétní web musíte vědět sám, ale je dobré to umět.
pole
Profil *
díky všem vašim radám to funguje suprově a kód vypadá takto:
      <ul>
        <?php
        $menu = array(array('name' => 'odkaz 1', 'href' => '', 'submenu' => array(array('name' => 'položka a', 'href' => ''),
                                                                                  array('name' => 'položka b', 'href' => ''),
                                                                                  array('name' => 'položka c', 'href' => ''),
                                                                                  array('name' => 'položka d', 'href' => '')
                                                                                 )
                           ),  
                      array('name' => 'odkaz 2', 'href' => ''),
                      array('name' => 'odkaz 3', 'href' => ''),
                      array('name' => 'odkaz 4', 'href' => '', 'submenu' => array(array('name' => 'položka a', 'href' => ''),
                                                                                  array('name' => 'položka b', 'href' => '')
                                                                                 )              
                           )
                     );
        
          foreach ($menu as $li)
            {
            echo "<li class='odkaz'><a href=" . $li['href'] . ">". $li['name'] . "</a>";
            if (isset($li['submenu']))
              {
              echo "<ul>";
              foreach ($li['submenu'] as $submenu)
                {
                echo "<a href=" . $submenu['href'] . "><li>".$submenu['name']."</li></a>";
                }
              echo "</ul>";
              }
            echo "</li>";
            }        
        ?>
      </ul>
je nějak možné udělat to, aby celý <li class="odkaz></li> byl odkaz? kód: <li class='odkaz'><a href=''>odkaz 1<a><ul>....</ul></li> a toto <a href=''><li class='odkaz'>odkaz 1<ul>....</ul></li><a> samozřejmě nejde
juriad
Profil
pole:
Budeš Mít <li ...><a ...>Odkaz</a>...</li> a to trošku nastyluješ, nejspíš něco jako:
#menu li>a {
  display: block;
}
pole
Profil *
ajo, že mě to nenapadlo: margin u li jsem vyměnil za padding u a a už to je, jak chci
děkuji

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: