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

Ivan Nový

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #30 kdy: 02. 01. 2018, 20:12:23 »
@ Honza

Nefunguje to proto, že funkce array_walk nevrací výsledek, ale pravdivostní hodnotu, která určuje zda zpracování proběhlo bez chyby, pokud funkce aplikovaná na pole pomocí array_walk vrátí false po detekci chyby, vrátí false i funkce array_walk. Ta funkce, která se vkládá do array_walk se volá pro každý prvek pole znovu.


Honza

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #31 kdy: 02. 01. 2018, 22:16:04 »
Díky za objasnění..

Zkusil jsem napsat vlastní funkci z mých velmi omezených  znalostí z PHP až na jediný špatný odkaz (u FFF) všechno funguje správně :) Možná je to blbost, ale nemůžu zjistit proč tomu tak je.

Kód: [Vybrat]
$array                              = [] ;
$array["aaa"]                       = ["AAA"];
$array["bbb"]                       = ["BBB"];
$array["ccc"]                       = ["CCC"];
$array["ccc"]["ddd"]                = ["DDD"];
$array["ccc"]["ddd"]["eee"]         = ["EEE"];
$array["ccc"]["ddd"]["eee"]["eee2"] = ["EEE2"];
$array["fff"]                       = ["FFF"];
$array["ggg"]                       = ["GGG"];
$array["hhh"]                       = ["HHH"];
$array["hhh"]["iii"]                = ["III"];


function render2($data , $path=''){
        $return = "<ul>";
        foreach ($data as $key => $element){
                if(is_array($data[$key])){
                        $return .= "<li>";
                        $path = $path . '/' . $key ;
                        $return .= '<a href="'.$path.'">'.$element[0].'</a>';
                        $return .= "</li>";
                        if(count(array_keys($data[$key]))==2){
                                $return .= render2($data[$key], $path);
                        }
                        else{
                                $path = '' ;
                        }
                }
        }

        $return .= "</ul>";
        return $return ;
}

echo render2($array) ;

Ivan Nový

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #32 kdy: 03. 01. 2018, 06:49:49 »
To je proto, že cesta není upravena po vynoření se z úrovně zanoření. Upravený algoritmus zde http://sandbox.onlinephpfunctions.com/code/95e82581e6945576feaf342c8da788fd211962af

Ivan Nový

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #33 kdy: 03. 01. 2018, 07:00:56 »
Vaše funkce ale nebude fungovat, když se do dat přidá:
Kód: [Vybrat]
$array["ccc"]["xxx"]["eee"]["eee2"] = ["EEE2"];

Ivan Nový

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #34 kdy: 03. 01. 2018, 07:20:44 »


Ivan Nový


Honza

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #36 kdy: 03. 01. 2018, 12:09:13 »
Vaše funkce ale nebude fungovat, když se do dat přidá:
Kód: [Vybrat]
$array["ccc"]["xxx"]["eee"]["eee2"] = ["EEE2"];
A víte proč? Je to tím, že je ta funkce celá špatně?

Honza

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #37 kdy: 03. 01. 2018, 13:58:42 »
Ještě se chybka vloudila, nakonec správně takto http://sandbox.onlinephpfunctions.com/code/6d58192b208d0f6dda5024af0c0bfa60631ee5ba
Se dívám, že to taky nefunguje správně.

mmm

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #38 kdy: 03. 01. 2018, 14:00:48 »
Díky za objasnění..

Zkusil jsem napsat vlastní funkci z mých velmi omezených  znalostí z PHP až na jediný špatný odkaz (u FFF) všechno funguje správně :) Možná je to blbost, ale nemůžu zjistit proč tomu tak je.

Kód: [Vybrat]
$array                              = [] ;
$array["aaa"]                       = ["AAA"];
$array["bbb"]                       = ["BBB"];
$array["ccc"]                       = ["CCC"];
$array["ccc"]["ddd"]                = ["DDD"];
$array["ccc"]["ddd"]["eee"]         = ["EEE"];
$array["ccc"]["ddd"]["eee"]["eee2"] = ["EEE2"];
$array["fff"]                       = ["FFF"];
$array["ggg"]                       = ["GGG"];
$array["hhh"]                       = ["HHH"];
$array["hhh"]["iii"]                = ["III"];


function render2($data , $path=''){
        $return = "<ul>";
        foreach ($data as $key => $element){
                if(is_array($data[$key])){
                        $return .= "<li>";
                        $path = $path . '/' . $key ;
                        $return .= '<a href="'.$path.'">'.$element[0].'</a>';
                        $return .= "</li>";
                        if(count(array_keys($data[$key]))==2){
                                $return .= render2($data[$key], $path);
                        }
                        else{
                                $path = '' ;
                        }
                }
        }

        $return .= "</ul>";
        return $return ;
}

echo render2($array) ;

v tom řešení je víc věcí špatně. Uzavíráte li před začítkem ul, ale ve vzorovém html je ul uvnitř li. $path nulujete až po výpisu odkazu, proto vám to u FFF nefunguje. Nebude to fungovat v případě, kdy má jeden prvek více než jednoho potomka, ale to možná nepotřebujete.

mmm

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #39 kdy: 04. 01. 2018, 13:47:54 »
Ještě se chybka vloudila, nakonec správně takto http://sandbox.onlinephpfunctions.com/code/6d58192b208d0f6dda5024af0c0bfa60631ee5ba
Se dívám, že to taky nefunguje správně.

je tam malá chybka. V odkazech chybí poslední část cesty. Zkuste tohle.

Kód: [Vybrat]
function render_element($element, $key, $path) {
    echo "<li>";
        $path = array_merge($path, [$key]);
        if (isset($element[0])) {
            echo '<a href="'.implode("/", $path).'">'.$element[0].'</a>';
            unset($element[0]);
        }
        render($element, $path);
        echo "</li>";
}