Úprava PHP kódu pro výpis seznamu z pole

Honza

Úprava PHP kódu pro výpis seznamu z pole
« kdy: 01. 01. 2018, 20:22:32 »
Ahoj, může někdo poradit jak vypsat z takového pole
Kód: [Vybrat]
    $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"];

takový html výsledek ?

Kód: [Vybrat]
    <ul>
    <li><a href="aaa">AAA</a></li>
    <li><a href="bbb">BBB</a></li>
    <li><a href="ccc">CCC</a>
    <ul>
      <li><a href="ccc/ddd">DDD</a>
        <ul>
          <li><a href="ccc/ddd/eee">EEE</a></li>
        </ul>
      </li>
    </ul>
    </li>
    <li><a href="fff">FFF</a></li>
    <li><a href="ggg">GGG</a></li>
    </ul>


Zatím mám takový kód ale ten nedokáže vypsat vnořené url.

   
Kód: [Vybrat]
private function makeList($array)
    {
      if(is_array($array))
      {
        $pridej_ul = false;
        $output = '';
        $url = '';
        foreach($array as $key => $subArray)
        {
          if(isset($subArray ["url"]))
          {
            $pridej_ul = true;
            $output .= '<li>';
            $output .= '<a href="'.$subArray["url"].'">'.$subArray["name"].'</a>';
            $output .= $this -> makeList ( $subArray );
            $output .= '</li>';
          }
          else
          {
            $output .= $this -> makeList($subArray);
          }
        }

        if ($pridej_ul)
        {
          $output = '<ul>'.$output.'</ul>';
        }
      }
      else
      {
        $output = '';
      }

      return $output;
    }

Díky za pomoc.


oNeDaL

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #1 kdy: 01. 01. 2018, 23:35:32 »
Možná nějak takkhle...

Kód: [Vybrat]
   
    function render(array $array) {
       
        $expected = ['url', 'name'];
       
        echo '<ul>';
       
        foreach ($array as $item) {
           
            echo sprintf('<li><a href="%s">%s</a></li>', $item['url'], $item['name']);
           
            if (count($item) > 2) {
                $nested = array_filter(
                    $item,
                    function ($key) use ($expected) {
                        return !in_array($key, $expected) ? $key : false;
                    },
                    ARRAY_FILTER_USE_KEY
                );
               
                render($nested);
            }
        }
       
        echo '</ul>';
    }
   
    render($array);

Honza

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #2 kdy: 02. 01. 2018, 01:32:29 »
Díky, ale taky ti to nevypisuje správně ty url...

Ivan Nový

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #3 kdy: 02. 01. 2018, 04:25:52 »
Nějak tak?
Kód: [Vybrat]
$render = function($element, $key, $path) {
if (isset($element['name'] && isset['url'])) {
sprintf("<li><a href='%s'>%s</a> ", explode("/", $path), $element['name']);
} else {
sprintf("<ul>");
array_walk($element, __function__, array_merge($path, array($key));
sprintf("</ul>");
}
};

array_walk($array, $render, array());

.

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #4 kdy: 02. 01. 2018, 04:51:30 »
Zamysli se nad tím, co tohle udělá:
Kód: [Vybrat]
$array["ccc"]               = ["url"=>"ccc", "name"=>"CCC"];
$array["ccc"]["ddd"]        = ["url"=>"ddd", "name"=>"DDD"];
$array["ccc"]["ddd"]["eee"] = ["url"=>"eee", "name"=>"EEE"];
S tím se prostě blbě pracuje.

A zapomněl jsi uvést, že definice toho pole právě takhle není daná a můžeš si ho definovat jakkoliv jinak. Tak ho prostě definuj nějak "normálně".


Ivan Nový

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #5 kdy: 02. 01. 2018, 04:55:30 »
A po odladění takto:
Kód: [Vybrat]
function render($element, $key, $path) {
    $path = array_merge($path, array($key));
    echo "<li>";
    if (isset($element['name']) && isset($element['url'])) {
  echo sprintf("<a href='%s'>%s</a>", implode("/", $path), $element['name']);
  unset($element['name']);
  unset($element['url']);
    }
    if ($element) {
   echo "<ul>";
   array_walk($element, 'render', $path);
   echo "</ul>";
     }
     echo "</li>";
};

echo "<ul>";
array_walk($array, 'render', array());
echo "</ul>";
   

Ivan Nový

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #6 kdy: 02. 01. 2018, 05:07:55 »
A po refaktorování takto:
Kód: [Vybrat]
function render_element($element, $key, $path) {
    echo "<li>";
$path = array_merge($path, array($key));
if (isset($element['name']) && isset($element['url'])) {
echo sprintf("<a href='%s'>%s</a>", implode("/", $path), $element['name']);
unset($element['name']);
unset($element['url']);
}
render($element, $path);
echo "</li>";
};

function render($array, $path=array()) {
    if ($array) {
        echo "<ul>";
        array_walk($array, 'render_element', $path);
        echo "</ul>";   
    }
}

render($array);


oNeDaL

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #7 kdy: 02. 01. 2018, 09:49:31 »
Díky, ale taky ti to nevypisuje správně ty url...

Rád bych řekl, že sem ti nastřelil jen část, aby ses nad tím kódem zamyslel a zkusil to dořešit sám. Pravda je taková, že sem to prostě přehlédl a že ty data jsou uložený retardovaně tak se mi zase nechtělo tím pálit svůj čas. Ale řešení už tu od Ivana máš :-)

Honza

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #8 kdy: 02. 01. 2018, 10:53:06 »
@Ivan Nový
Velmi děkuji za tvůj čas, jdu to zkusit nějak nastudovat. Musí tam prosím ty klíče být, nebo by to šlo i bez nich?

Myslím takto:

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

oNeDaL

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #9 kdy: 02. 01. 2018, 11:02:43 »
Nemusí :D

mmm

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #10 kdy: 02. 01. 2018, 11:14:33 »
Nemusí :D

musí, jinak se vám ztratí ty cesty. Naopak tam nemusí být ty koncové name a url.

Ivan Nový

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #11 kdy: 02. 01. 2018, 12:19:57 »
List alá Python, nebo Lisp
Kód: [Vybrat]
array(
  array('aaa', null),
  array('bbb', null)
  array('ccc',
    array('ddd',
      array('eee', null))),
  array('fff', null),
  array('ggg', null),
);

Ivan Nový

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #12 kdy: 02. 01. 2018, 12:31:26 »
Pak z elementu se dá vyextrahovat, pouze naznačeno
Kód: [Vybrat]
$suburl = reset($element);
$name = strtoupper(reset($element));
if (end($element)) array_walk(end($element), 'render_element', $path);

Honza

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #13 kdy: 02. 01. 2018, 15:25:51 »
@Ivan Nový

Moc děkuji, tak jsem to zkusil opravit ale nevypíše se vůbec nic :(

Takto to teď celé mám

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

function render_element($element, $key, $path) {
    echo "<li>";
$path = array_merge($path, array($key));
if (isset($element['name']) && isset($element['url'])) {
echo sprintf("<a href='%s'>%s</a>", implode("/", $path), $element['name']);
unset($element['name']);
unset($element['url']);
}
render($element, $path);
echo "</li>";
}

function render($array, $path=array()) {
    if ($array) {
        echo "<ul>";
        //array_walk($array, 'render_element', $path);
        $suburl = reset($element);
        $name = strtoupper(reset($element));
        if (end($element)) array_walk(end($element), 'render_element', $path);
        echo "</ul>";
    }
}

render($array);


Ivan Nový

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #14 kdy: 02. 01. 2018, 15:42:52 »
@Ivan Nový

Moc děkuji, tak jsem to zkusil opravit ale nevypíše se vůbec nic :(

Takto to teď celé mám

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

function render_element($element, $key, $path) {
    echo "<li>";
$path = array_merge($path, array($key));
if (isset($element['name']) && isset($element['url'])) {
echo sprintf("<a href='%s'>%s</a>", implode("/", $path), $element['name']);
unset($element['name']);
unset($element['url']);
}
render($element, $path);
echo "</li>";
}

function render($array, $path=array()) {
    if ($array) {
        echo "<ul>";
        //array_walk($array, 'render_element', $path);
        $suburl = reset($element);
        $name = strtoupper(reset($element));
        if (end($element)) array_walk(end($element), 'render_element', $path);
        echo "</ul>";
    }
}

render($array);

No to byly jen příklady jak přistupovat k prvkům těch elementů, řádky logicky spolu nesouvisely. Nedá se to takto přímočaře použít. Zkuste více porozumět tomu co to dělá. Podívejte se do dokumentace, co použité funkce dělají. Jinak to vaše původní pole nakonec nebylo tak krkolomné, jak se zdálo, viz z toho vzniklý refaktorovaný algoritmus, který je relativně kompaktní. V algoritmu byla použita nepřímá rekurze.