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

Honza

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #15 kdy: 02. 01. 2018, 15:56:46 »
@Ivan Nový
Aha, tak to já nedám ani omylem, jsem "jen" grafik, ne programátor :( v php znám jen pár primitivních funkcí které používám pro statický web. Tohle jsem chtěl abych nemusel při každé změně přepisovat tuny nepřehledného html kódu.
V každém případě moc děkuji a třeba se někdo slituje a doplní to ;)


mmm

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #16 kdy: 02. 01. 2018, 16:21:26 »
to řešení funguje jen s tou původní reprezentací.

Ta vaše reprezentace
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"];
není moc snadno použitelná. Když si ji vytisknete jako JSON dostanete
Kód: [Vybrat]
[
    {
        "url": "aaa",
        "name": "AAA"
    },
    {
        "url": "bbb",
        "name": "BBB"
    },
    {
        "url": "ccc",
        "name": "CCC"
    },
    [
        {
            "url": "ddd",
            "name": "DDD"
        }
    ],
    [
        [
            {
                "url": "eee",
                "name": "EEE"
            }
        ]
    ],
    {
        "url": "fff",
        "name": "FFF"
    },
    {
        "url": "ggg",
        "name": "GGG"
    }
]

Ivan Nový

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #17 kdy: 02. 01. 2018, 16:22:45 »
Tak použijte ten původní tvar vašeho pole s indexy. Struktura toho pole bude pro vás srozumitelnější a pravděpodobně jen to pole bude plnit hodnotami, které potřebujete. A tento kód, to by mělo fungovat.
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"];

function render_element($element, $key, $path) {
    echo "<li>";

    // Konstrukce aktuální cesty
    $path = array_merge($path, array($key));

    // Pokud element obsahuje name a url, vypíše se element <a>
    if (isset($element['name']) && isset($element['url'])) {
echo sprintf("<a href='%s'>%s</a>", implode("/", $path), $element['name']);
unset($element['name']);
unset($element['url']);
    }

    // Vykreslení elementu <ul>
    render($element, $path);
    echo "</li>";
};

// Vykreslení pole ohraničeného elementem <ul>
function render($array, $path=array()) {
    if ($array) {
        echo "<ul>";
        array_walk($array, 'render_element', $path);
        echo "</ul>";   
    }
}

render($array);


mmm

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

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

oprava, nemsí, ale bude to zbytečně komplikované.

Honza

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #19 kdy: 02. 01. 2018, 16:32:40 »
@Ivan Nový

OK, a proč mi to prosím nefunguje, nahradil jsem echo za $ret abych mohl vypsat data přesně tam kde potřebuji. Vypíše se ale pouze číslo 1 :)

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["ccc"]["ddd"]["eee"]["eee2"] = ["url"=>"eee2", "name"=>"EEE2"];
$array["fff"]               = ["url"=>"fff", "name"=>"FFF"];
$array["ggg"]               = ["url"=>"ggg", "name"=>"GGG"];


function render_element($element, $key, $path) {

    $ret = '';
    $ret .= "<li>";
$path = array_merge($path, array($key));
if (isset($element['name']) && isset($element['url'])) {
$ret .= '<a href="'.implode("/", $path).'">'.$element['name'].'</a>';
unset($element['name']);
unset($element['url']);
}
$ret .= render($element, $path);
$ret .= "</li>";

        return $ret ;
}

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

$con = render($array);

echo $con ;


Honza

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #20 kdy: 02. 01. 2018, 16:37:50 »
@mmm
nevím co je to json ale co tedy takto? Bude to lepší?

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

Nechci tady vysírat, jelikož jsem vážně rád, že se mi tady někdo snaží pomoci, ale jde o to, že tam budou stovky odkazů, tak ať je to pole co nejmenší..

Ivan Nový

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #21 kdy: 02. 01. 2018, 16:42:38 »
Stovky odkazů jsou v pohodě.

Ivan Nový

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #22 kdy: 02. 01. 2018, 16:54:09 »
Zde je upravený a funkční kód http://sandbox.onlinephpfunctions.com/code/954f2d8bdac768cfd2de82e72992abdaeba9cfbf
Je to sandbox, lze ho tam i spustit.

mmm

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #23 kdy: 02. 01. 2018, 17:33:03 »
Nechci tady vysírat, jelikož jsem vážně rád, že se mi tady někdo snaží pomoci, ale jde o to, že tam budou stovky odkazů, tak ať je to pole co nejmenší..

napadla mě taková reprezentace

Kód: [Vybrat]
$array = ["aaa", "bbb", ["ccc", [["ddd", ["eee"]]]], "fff", "ggg"];

celé řešení s použitím vnořeného generátoru včetně odsazení
Kód: [Vybrat]

$array = ["aaa", "bbb", ["ccc", [["ddd", ["eee"]]]], "fff", "ggg"];


function a($path, $text) {
    $spath = join('/', array_merge($path, [$text]));
    return "<a href=\"$spath\">".strtoupper($text)."</a>";
}

function ul($array, $path=[]){
    $indent = str_repeat("    ", count($path));
    yield "$indent<ul>";
    foreach($array as $content){
        if(is_array($content)){
            list($content, $ul) = $content;
            yield "$indent  <li>".a($path, $content);
            yield from ul($ul, array_merge($path, [$content]));
            yield "$indent  </li>";
        }else{
            yield "$indent  <li>".a($path, $content)."</li>";
        }
    }
    yield "$indent</ul>";
}

function render($array){
    foreach(ul($array) as $line) {
        echo "$line\n";
    }
}

render($array);

Ivan Nový

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #24 kdy: 02. 01. 2018, 17:37:27 »
@mmm

To je pěkné, ale není-li tazatel programátor, bude se mu ručně lépe vyplňovat to pole, jak si ho sám navrhl a nebude záležet na pořadí v jakém tam ty linky bude sázet, může to pohodlněji rozšiřovat, nemusí dodržovat žádnou strukturu mezi řádky, jen strukturu v rámci řádku.

mmm

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #25 kdy: 02. 01. 2018, 17:57:19 »
@mmm

To je pěkné, ale není-li tazatel programátor, bude se mu ručně lépe vyplňovat to pole, jak si ho sám navrhl a nebude záležet na pořadí v jakém tam ty linky bude sázet, může to pohodlněji rozšiřovat, nemusí dodržovat žádnou strukturu mezi řádky, jen strukturu v rámci řádku.

chtěl minimální velikost. Vaše reprezentace obsahuje redundantní informaci a překlep ji znevalidní.

Ivan Nový

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #26 kdy: 02. 01. 2018, 18:11:23 »
@mmm

jj, vaše řešení je vážně pěkné.

j

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #27 kdy: 02. 01. 2018, 18:27:29 »
...
Php (mimo jiny) umi nativne XML a interne je to reprezentovany jako pole. A defakto cely (a libovolne strukturovany) pole vysypes do X/Html jednim radkem.

Tuhle mas nejakej sampl https://stackoverflow.com/questions/1397036/how-to-convert-array-to-simplexml. Samosebou to umi i mnohem slozitejsi konstrukty a muzes (pokud bys chtel) pouzivat XSL.

Jen bacha na to, ze phpko ma dva ruzny enginy, ten simple je fakt simple a moc toho neumi => musis prizpusobit strukturu tomu co umi.


Honza

Re:Úprava PHP kódu pro výpis seznamu z pole
« Odpověď #28 kdy: 02. 01. 2018, 19:38:47 »
Zde je upravený a funkční kód http://sandbox.onlinephpfunctions.com/code/954f2d8bdac768cfd2de82e72992abdaeba9cfbf
Je to sandbox, lze ho tam i spustit.

Funguje to parádně, velmi moc děkuji. Ten výpis je opravdu možný pouze pomocí ob_start()... ? Prozradíš mi prosím proč to nefunguje, tak jak jsem to dosadil do těch proměnných?


Ivan Nový

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

Bylo to jednodušší řešení v daném případě, navíc možná i efektivnější co do zdrojů, protože zpracování řetězců probíhá na nižší úrovni jazyka v C. Prostě se jen výstup přesměruje do bufferu a nic není třeba měnit, obejde se práce s řetezci v PHP, jejich skládání a alokace paměti.