Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Oprava PHP kódu

Ahoj, funkce vypisuje seznam z pole v PHP, jenže je tam nějaká chyba a nemůžu jí najít. Generuje to více položek než by mělo. Strukturu pole bych potřeboval zachovat tak jak je. Poradí někdo zkušený? Předem děkuji.


$array = [] ;
$array["aaa"]               = ["url"=>"aaa", "name"=>"AAA"];
$array["bbb"]               = ["url"=>"bbb", "name"=>"BBB"];
$array["ccc"]               = ["url"=>"ccc", "name"=>"CCC"];
$array["ccc"]["ddd"]        = ["url"=>"ddd", "name"=>"DDD"];
$array["ccc"]["ddd"]["eee"] = ["url"=>"eee", "name"=>"EEE"];
$array["fff"]               = ["url"=>"fff", "name"=>"FFF"];
$array["ggg"]               = ["url"=>"ggg", "name"=>"GGG"];
 

function makeList($array){
      $output = '<ul>';
      foreach ($array as $key => $subArray){
             $output .= '<li><a href="'.$subArray["url"].'">'.$subArray["name"].'</a>';
             $output .= makeList($subArray);
             $output .= '</li>';
      }
      $output .= '</ul>';
      return $output;
}

echo makeList($array);

A tady je výstup
xaDZ66Kd

Předmět Autor Datum
Foreach prováděj jen na array: function makeList($array){ if (is_array($array)) { $output = '<ul>'…
hynajs 30.12.2017 13:15
hynajs
Ahoj, děkuji za snahu ale výsledek je stále špatně, červeně označené položky tam nemají být. www.ima…
Honza11 30.12.2017 13:40
Honza11
Viz níže.
hynajs 30.12.2017 13:41
hynajs
Moc děkuji, jsem pomalejší na psaní ;) Ještě bych se chtěl zeptat, když je tam nějaké submenu v tomt…
Honza11 30.12.2017 13:54
Honza11
Ještě vylepšení, asi chceš výpis takhle: function makeList($array){ if (is_array($array)) { $outpu…
hynajs 30.12.2017 13:35
hynajs
Ano, je vidět, že jsi profík, výpis je už správně, ale html stále vypisuje prázdné "<ul></ul>", jde…
Honza11 30.12.2017 13:47
Honza11
Tohle je již validní (vyzkoušel jsem): function makeList($array){ if (is_array($array)) { $pridej_…
hynajs 30.12.2017 14:35
hynajs
Rekurzívní funkce jako argument? Tak to jdu googlit.. co to vůbec znamená. :-( Jaký účel plní ta pro…
Honza11 30.12.2017 17:30
Honza11
Nepsal jsem rekurzívní funkce jako argument, ale měl bys sis možná přidat další argument do té funkc…
hynajs 30.12.2017 18:35
hynajs
To nedám, jsem grafik, ne programátor :-)
Honza11 30.12.2017 22:42
Honza11
Vážně nikdo neporadí? :-/
Honza11 01.01.2018 21:29
Honza11
S čím? Řešení už tu máš, ne?
Wikan 01.01.2018 21:38
Wikan
Potřebuji poradit jak složit ty odkazy...
Honza11 01.01.2018 21:50
Honza11
Jaké zas odkazy? ::)
host 01.01.2018 22:05
host
Bez záruky, v PHP nedělám. function makeList($array, $prevKey = null){ if (is_array($array)) { $pri… poslední
Wikan 01.01.2018 22:08
Wikan

Foreach prováděj jen na array:


function makeList($array){
      if (is_array($array)) {
        $output = '<ul>';
        foreach ($array as $key => $subArray){
             $output .= '<li><a href="'.$subArray["url"].'">'.$subArray["name"].'</a>';
             $output .= makeList($subArray);
             $output .= '</li>';
        }
        $output .= '</ul>';
      }
      else $output = ''; 
      return $output;
}

Moc děkuji, jsem pomalejší na psaní ;)
Ještě bych se chtěl zeptat, když je tam nějaké submenu v tomto případě


$array["ccc"]               = ["url"=>"ccc", "name"=>"CCC"];
$array["ccc"]["ddd"]        = ["url"=>"ddd", "name"=>"DDD"];
$array["ccc"]["ddd"]["eee"] = ["url"=>"eee", "name"=>"EEE"];

CCC
    DDD
        EEE

šlo by spojit ty url tak, aby byly odkazy


<a href="ccc">CCC</a>
    <a href="ccc/ddd">DDD</a>
       <a href="ccc/ddd/eee">EEE</a>

Děkuji

Ještě vylepšení, asi chceš výpis takhle:


function makeList($array){
      if (is_array($array)) {
      $output = '<ul>';
        foreach ($array as $key => $subArray){
          if (isset($subArray["url"])) {
             $output .= '<li>';
             $output .= '<a href="'.$subArray["url"].'">'.$subArray["name"].'</a>';
             $output .= '</li>';
          }
          $output .= makeList($subArray);
        }
      $output .= '</ul>';
      }
      else $output = ''; 
      return $output;
}

Ano, je vidět, že jsi profík, výpis je už správně, ale html stále vypisuje prázdné "<ul></ul>", jde to prosím opravit, aby to bylo i validní? Děkuji

<ul>
<li><a href="aaa">AAA</a></li>
<ul></ul>
<li><a href="bbb">BBB</a></li>
<ul></ul>
<li><a href="ccc">CCC</a></li>
<ul>
<li><a href="ddd">DDD</a></li>
<ul>
<li><a href="eee">EEE</a></li>
<ul></ul>
</ul>
</ul>
<li><a href="fff">FFF</a></li>
<ul></ul>
<li><a href="ggg">GGG</a></li>
<ul></ul>
</ul>

Tohle je již validní (vyzkoušel jsem):


function makeList($array){
      if (is_array($array)) {
        $pridej_ul=false;
        foreach ($array as $key => $subArray){
          if (isset($subArray["url"])) {
             $pridej_ul=true;
             $output .= '<li>';
             $output .= '<a href="'.$subArray["url"].'">'.$subArray["name"].'</a>';
             $output .= makeList($subArray);
             $output .= '</li>';
          }
          else $output .= makeList($subArray);
        }
        if ($pridej_ul) $output = '<ul>'.$output.'</ul>';
      }
      else $output = ''; 
      return $output;
}

Pokud chceš ještě ty složené odkazy, pak je jednou z možností vkládat části odkazu do rekurzívní funkce jako argument.
Přenechávám za cvičení, neboť musím jít běhat s psíkem, než se vyrojí magoři s petardami.

Bez záruky, v PHP nedělám.

function makeList($array, $prevKey = null){
      if (is_array($array)) {
        $pridej_ul=false;
        foreach ($array as $key => $subArray){
          $url = $prevKey.$key;
          if (isset($subArray["url"])) {
             $pridej_ul=true;
             $output .= '<li>';
             $output .= '<a href="'.$url.'">'.$subArray["name"].'</a>';
             $output .= makeList($subArray);
             $output .= '</li>';
          }
          else $output .= makeList($subArray, $url."/");
        }
        if ($pridej_ul) $output = '<ul>'.$output.'</ul>';
      }
      else $output = ''; 
      return $output;
}

Zpět do poradny Odpovědět na původní otázku Nahoru