Jak vytvořit a vypsat složitější pole bez databáze

Honza

Ahoj, snažím se vytvořit a vypsat pole v php. V manuálu jsem zjistil, že můžu vytvořit pole třeba takto
Kód: [Vybrat]
$pole = [ "windows" => "Windows" , "linux" => "Linux" , "apple" => "Apple" ] ;a následně ho můžu celé vypsat třeba takto
Kód: [Vybrat]
foreach ($array as $key=>$value){
 echo $key."<br>";
 echo $value."<br>";
}
Jenže už jsem nenašel/nepochopil, jak bych mohl vypsat pole, které by ještě mělo u každé položky další položky. Nevím jak to přesně napsat, zkusím raději napsat jak by měl vypadat výsledek.

Kód: [Vybrat]
<a href="/windows">Windows</a>
    <a href="/windows/windows10">+ Windows10</a>
    <a href="/windows/windows7">+ Windows7</a>
    <a href="/windows/windowsXP">+ WindowsXP</a>
<a href="/linux">Linux</a>
   <a href="/linux/debian">+ Debian</a>
      <a href="/linux/debian8">+ + Debian8</a>
      <a href="/linux/debian7">+ + Debian7</a>
   <a href="/linux/ubuntu">+ Ubuntu</a>
   <a href="/linux/opensuse">+ OpenSuse</a>
<a href="/apple">Apple</a>

poradil by mi někdo, jak vytvořit a vypsat takové pole? Děkuji za pomoc.
« Poslední změna: 02. 03. 2017, 21:25:38 od Petr Krčmář »


Kit

Re:Jak vytvořit a vypsat složitější pole bez databáze.
« Odpověď #1 kdy: 02. 03. 2017, 15:05:56 »
Kód: [Vybrat]
$strom = [
    "windows" => ["Windows 95", "Windows XP", "Windows 10"],
    "linux" => ["Debian", "Fedora", "CentOs"],
    "apple" => "Apple",
] ;

Honza

Re:Jak vytvořit a vypsat složitější pole bez databáze.
« Odpověď #2 kdy: 02. 03. 2017, 16:22:11 »
No takové pole umím už taky vytvořít, jenže já se ptal na něco jiného.  ???

hu

Re:Jak vytvořit a vypsat složitější pole bez databáze.
« Odpověď #3 kdy: 02. 03. 2017, 16:42:36 »
No takové pole umím už taky vytvořít, jenže já se ptal na něco jiného.  ???

Vnořený cykly.

Re:Jak vytvořit a vypsat složitější pole bez databáze.
« Odpověď #4 kdy: 02. 03. 2017, 17:46:53 »
Ak by to malo byť pole, tak napríklad:
Kód: [Vybrat]
$pole = [ "windows" => ["Windows" , [ "windows7" => "Windows 7",
                                      "windows8" => "Windows 8",
                                      "windows10" => "Windows 10" ]],
          "linux" => ["Linux", [ "gentoo" => "Gentoo",
                                 "debian8" => "Debian 8",
                                 "ubuntu" => "Ubuntu 16.04LTS" ]],
          "apple" => ["Apple", ["apple" => "Apple"]] ;

Výpis položiek by mohol vyzerať napríklad takto:
Kód: [Vybrat]
foreach ($pole as $key => $value){
    echo $key . "<br>";
    echo $value[0] . "<br>";
    foreach ($value[1] as $key1 => $value1){
        echo $key1 . "<br>";
        echo $value1 . "<br>";
}

alebo aj takto:
Kód: [Vybrat]
foreach ($pole as $key => $value){
    echo "<a href=\"/{$key}\">{$value[0]}</a>";
    foreach ($value[1] as $key1 => $value1){
        echo "    <a href=\"/{$key}/{$key1}\">+ + {$value1}</a>";
}

Celé je to samozrejme blbosť a v praxi by som to určite urobil úplne inak, ale keď to musí byť pole tak teda pole.
Píšem to z hlavy, pre takúto prkotinu sa mi nechce vstať z postele a ísť k počítaču, takže je to bez záruky.


j

Re:Jak vytvořit a vypsat složitější pole bez databáze.
« Odpověď #5 kdy: 02. 03. 2017, 18:05:02 »
Mno .. pokud ti jde jen o ten vypis tak je tam print_r

j

Re:Jak vytvořit a vypsat složitější pole bez databáze.
« Odpověď #6 kdy: 02. 03. 2017, 18:08:27 »
Jo a pokud to chces ladovat do (x)html, tak je nejlepsi na to pouzivat xml funcionalitu ... z pole to zkonvertujes snadno. Navic mas nastroj na filtrovani/upravy/razeni/... .

Honza

Re:Jak vytvořit a vypsat složitější pole bez databáze.
« Odpověď #7 kdy: 02. 03. 2017, 18:09:05 »
Typický příklad pro použití návrhového vzoru Visitor. Prvky budou instance různých tříd, nějaká sada prvků (kontejner/pole) atd. Potom může mít každý prvek vlastní reprezentaci, pole projdu cyklem, prvek zobrazím třeba jako odkaz, a nezajímá mě, jakou strukturu to pole bude mít.
Takhle natvrdo navržený vnořený cyklus závisí na struktuře, jako to pole má, což není správně.

Honza

Re:Jak vytvořit a vypsat složitější pole bez databáze.
« Odpověď #8 kdy: 02. 03. 2017, 18:25:14 »
Ak by to malo byť pole, tak napríklad:
Kód: [Vybrat]
$pole = [ "windows" => ["Windows" , [ "windows7" => "Windows 7",
                                      "windows8" => "Windows 8",
                                      "windows10" => "Windows 10" ]],
          "linux" => ["Linux", [ "gentoo" => "Gentoo",
                                 "debian8" => "Debian 8",
                                 "ubuntu" => "Ubuntu 16.04LTS" ]],
          "apple" => ["Apple", ["apple" => "Apple"]] ;

Výpis položiek by mohol vyzerať napríklad takto:
Kód: [Vybrat]
foreach ($pole as $key => $value){
    echo $key . "<br>";
    echo $value[0] . "<br>";
    foreach ($value[1] as $key1 => $value1){
        echo $key1 . "<br>";
        echo $value1 . "<br>";
}

alebo aj takto:
Kód: [Vybrat]
foreach ($pole as $key => $value){
    echo "<a href=\"/{$key}\">{$value[0]}</a>";
    foreach ($value[1] as $key1 => $value1){
        echo "    <a href=\"/{$key}/{$key1}\">+ + {$value1}</a>";
}

Celé je to samozrejme blbosť a v praxi by som to určite urobil úplne inak, ale keď to musí byť pole tak teda pole.
Píšem to z hlavy, pre takúto prkotinu sa mi nechce vstať z postele a ísť k počítaču, takže je to bez záruky.

Díky moc, tohle dělá o co týden hledám :-(
Ty jo, že prkotina, a z postele zzsss  ;D ;D
A v čem to ještě může být když ne v poli a db používat zatím nechci?
A když je to tak jednoduché pro tebe, nešlo by to malinkoo poopravit aby tam nebylo žádné omezení? Myslím tím, že teď to vypisuje pouze 2 úrovně. Díky moc za pomoc.

Kit

Re:Jak vytvořit a vypsat složitější pole bez databáze.
« Odpověď #9 kdy: 02. 03. 2017, 19:19:57 »
No takové pole umím už taky vytvořít, jenže já se ptal na něco jiného.  ???

Vypsat to můžeš rekurzí.

ByCzech

  • *****
  • 1 870
    • Zobrazit profil
    • E-mail
Re:Jak vytvořit a vypsat složitější pole bez databáze
« Odpověď #10 kdy: 03. 03. 2017, 02:44:03 »
poradil by mi někdo, jak vytvořit a vypsat takové pole? Děkuji za pomoc.

Buď již zmíněný print_r nebo třeba var_dump

Re:Jak vytvořit a vypsat složitější pole bez databáze.
« Odpověď #11 kdy: 03. 03. 2017, 10:46:45 »
A když je to tak jednoduché pro tebe, nešlo by to malinkoo poopravit aby tam nebylo žádné omezení? Myslím tím, že teď to vypisuje pouze 2 úrovně. Díky moc za pomoc.

V php som už roky nič nenapísal, ale ešte si niečo pamätám.
Samozrejme že sa to dá:
Kód: [Vybrat]
    $pole = [ "windows" => ["Windows" , [ "windows7" => "Windows 7",
                                      "windows8" => "Windows 8",
                                      "windows10" => "Windows 10" ]],
          "linux" => ["Linux", [ "gentoo" => "Gentoo",
                                 "debian" => ["Debian",["debian8" => "Debian 8",
                                                        "debian9" => "Debian 9"]],
                                 "ubuntu" => "Ubuntu 16.04LTS" ]],
          "apple" => "Apple"] ;

    function menu(string $path, array $pole) {
        foreach ($pole as $key => $value){
            $newPath = $path . $key . "/";
            if (is_array($value)) {
                echo "<a href=\"/{$newPath}\">{$value[0]}</a><br>\n";
                menu($newPath, $value[1]);
            } else {
                echo "<a href=\"/{$newPath}\">{$value}</a><br>\n";
            }
        }   
    }
   
    menu("", $pole);

S rekurzívnou funkciou môže byť hĺbka vnorenia ľubovoľná, od 1..
Toto je výsledok:
Kód: [Vybrat]
<a href="/windows/">Windows</a><br>
<a href="/windows/windows7/">Windows 7</a><br>
<a href="/windows/windows8/">Windows 8</a><br>
<a href="/windows/windows10/">Windows 10</a><br>
<a href="/linux/">Linux</a><br>
<a href="/linux/gentoo/">Gentoo</a><br>
<a href="/linux/debian/">Debian</a><br>
<a href="/linux/debian/debian8/">Debian 8</a><br>
<a href="/linux/debian/debian9/">Debian 9</a><br>
<a href="/linux/ubuntu/">Ubuntu 16.04LTS</a><br>
<a href="/apple/">Apple</a><br>

Dnes sa už cítim lepšie, beriem ešte antibiotiká, ale vstal som z postele a zapol PC. ;)
Samozrejme by to ešte chcelo vnorené href posunúť doprava, aby to malo trošku fazónu, ale to už je tak jednoduché, že sa mi to nechce písať.