NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: foreach -> Po vyprázdnění zopakovat.

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
katrincsak
Člen
Avatar
katrincsak:23.8.2015 2:52

Zdravím,

dělám třídní knihu na kurzy/školení a 1 kurz má několik hodin v každém dni a pod to chci generovat jména žáků, aby se jednoduše ke každému dni mohlo zadat, že byl přítomen atp....Problém je že foreach se vysype pod první datum a pak je prázdný takže se už pak neopakuje. Samozřejmě bych to mohl uložit si a vypisovat to, ale to mi nepřijde úplně správný.

Používám MVC architekturu.

Načtení z DB do $this->data2['data'] (KurzKontroler­.php)

$this->data2['data'] = $DataSQL->zobrazitTerminy($_GET['kurz']);
$this->data3['data'] = $DataSQL->zobrazitZaky($_GET['kurz']);

Výpis v pohledu: (kurz.phtml)

foreach($this->data2['data'] as $data2)
{
        echo "<tr><td>".$data2['den']."/".$data2['mesic']."/".$data2['rok']." - ".$data2['od']." / ".$data2['do']."</td></tr>";

        foreach($this->data3['data'] as $data3)
        {
                echo "
                        <tr>
                                <td>".$data3['jmeno']."</td>
                                <td>".$data3['prijmeni']."</td>
                                <td>".$data3['popis']."</td>
                        </tr>";
        }
}

Problém je, že tohle pole nemohu číslovat...Nemohu $data3['jmeno'][1] nebo $this->data3['data']['jme­no'][0]

Kdybych mohl, tak si to spočítám a udělám to přes cyklus for. Možná to jde a dělám něco jinak než bych musel.

děkuji za rady ;-)

Editováno 23.8.2015 2:53
 
Odpovědět
23.8.2015 2:52
Avatar
katrincsak
Člen
Avatar
katrincsak:23.8.2015 3:00

Ještě přidávám fotku jen pro orientaci jak to vypadá aktuálně s menší úpravou html, ale nemám to ještě stylizovaný ! Potřebuji samozřejmě opakovat ty jména pod všechny ty datumy (možná jsme jen už unavenej dneska).

Editováno 23.8.2015 3:01
 
Nahoru Odpovědět
23.8.2015 3:00
Avatar
solta
Člen
Avatar
solta:23.8.2015 13:25

zaprvé pojmenovávej proměnné trochu rozměji než $this->data2['data']
pokud tě dobře chápu tak pole které potřebuješ vipadá nějak takto

Array
(
    [0] => Array
        (
            [den] => 1
            [mesic] => 1
            [rok] => 2015
            [od] => 10:00
            [do] => 11:00
            [zaci] => Array
                (
                    [0] => Array
                        (
                            [jmeno] => Tomas
                            [prijmeni] => Tak
                            [popis] => Popisi jsou otrava:)
                        )

                    [1] => Array
                        (
                            [jmeno] => Jan
                            [prijmeni] => Otloukal
                            [popis] => Popisi jsou otrava:)
                        )

                )

        )

    [1] => Array
        (
            [den] => 1
            [mesic] => 1
            [rok] => 2015
            [od] => 10:00
            [do] => 11:00
            [zaci] => Array
                (
                    [0] => Array
                        (
                            [jmeno] => Tomas
                            [prijmeni] => Tak
                            [popis] => Popisi jsou otrava:)
                        )

                    [1] => Array
                        (
                            [jmeno] => Jan
                            [prijmeni] => Otloukal
                            [popis] => Popisi jsou otrava:)
                        )

                )

        )

)

a v šavloně pak budes postupovat takto

foreach($kurzy as $kurz){
    echo $kurz['den'].'.'.$kurz['mesic'].'.'.$kurz['rok'].'<br>';
    foreach($kurz['zaci'] as $zak){
        echo $zak['jmeno'].' '.$zak['prijmeni'].' '.$zak['popis'].'<br>';
    }
    echo '<br>';
}

html tag si doplň podle potřeby

 
Nahoru Odpovědět
23.8.2015 13:25
Avatar
katrincsak
Člen
Avatar
Odpovídá na solta
katrincsak:23.8.2015 14:05

Vzhledem k tomu, že data přenáším mezi pohledem a kontrolerem (2 různé soubory) tak mám univerzální nosič a tak v tomto pro mě má logický název, ale jinde bych to použil lépe určitě.

Každopádně tvoje odpověď kopíruje co již mám. Jen jsi použil jiné názvy.

 
Nahoru Odpovědět
23.8.2015 14:05
Avatar
solta
Člen
Avatar
Odpovídá na katrincsak
solta:23.8.2015 15:02

předpokládám že vycházíš ze zdejšího tutorialu vhodnější by bylo použít v controleru

$this->data['kurzy'] = $DataSQL->zobrazitTerminy($_GET['kurz']);

v pohledu pak puziješ

foreach($kurzy as $kurz){
...
}

ja mám jinak poskládané to pole, pokud si ho sestavíš tak že žáci budou součásti pole kurzy, bude naprosto jasné kteří žáci patři do kterého kurzu. V tuto chvíli to z tvého pole popisu tak nevypadá, ale možná jenom špatně chápu tvůj postup

 
Nahoru Odpovědět
23.8.2015 15:02
Avatar
katrincsak
Člen
Avatar
Odpovídá na solta
katrincsak:23.8.2015 15:55

Až přijdu domů z práce zkusím se lépe podívat na to co jsi napsal, ale připadá mi to stejné. Ale jinak ano, MVC jsem se učil zde a tak jsem některé procesy samozřejmě zachoval, protože mi logika připadá úplně úžasná v php ;-)

 
Nahoru Odpovědět
23.8.2015 15:55
Avatar
katrincsak
Člen
Avatar
Odpovídá na solta
katrincsak:24.8.2015 16:54

Tak jsem předělal část struktury a děkuji moc za nalezení divné chyby a tím i tedy mohu jmenovat ty proměnné.

Ale co se týče problému, který řeším tak nevím jak.

Aktuální Kontroler:

$this->data['kurzy']    = $DataSQL->sqlSelect('*', 'tk_kurzy', 'id', $parametry[0]);
$this->data['terminy']  = $DataSQL->zobrazitTerminy($parametry[0]);
$this->data['zaky']     = $DataSQL->zobrazitZaky($parametry[0]);

$this->pohled = 'kurz';

Pohled:

foreach($terminy as $termin)
{
        echo "
                <tr>
                        <th>".$termin['den']."/".$termin['mesic']."/".$termin['rok']." - ".$termin['od']." / ".$termin['do']."</th>
                </tr>";

        foreach($zaky as $zak)
        {
                echo "
                        <tr>
                                <td>".$zak['jmeno']."</td>
                                <td>".$zak['prijmeni']."</td>
                                <td>".$zak['popis']."</td>
                        </tr>";
        }
}

Každopádně mám 2 pole a pakliže udělám podřazené což mi nejde vložit oba $DataSQL do $this->data['X'] tak si nejsem jist jestli to náhodou neudělá to samé?

Výsledek je v tomto případě stejný, prakticky se nic nezměnilo.

Editováno 24.8.2015 16:55
 
Nahoru Odpovědět
24.8.2015 16:54
Avatar
solta
Člen
Avatar
Odpovídá na katrincsak
solta:24.8.2015 19:03

jestli maji byt ke kademu kurzu stejni zaci tak by to melo fungovat tak jak to mas pok ne tak musi ke kazdemu kurzu pridat pole tech zaku tak jak to mam naznaceno vise
napis mi pripadne PM a muzem to vyresit pres skype at to neresime tyden :)

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
24.8.2015 19:03
Avatar
katrincsak
Člen
Avatar
Odpovídá na solta
katrincsak:24.8.2015 19:35

Právě že se žáci vysypou jen pod první datum a pak už se nesypou. Datum samozřejmě vypíše... Foreach pole se vyprázdní a pak už se nezopakuje. Zkoušel jsem udělat i vnořené pole a výsledek je stejný. Trávím tady hodiny nad blbostí, ale rád bych to udělal bez zbytečností :D

Napsal jsem ;-)

 
Nahoru Odpovědět
24.8.2015 19:35
Avatar
katrincsak
Člen
Avatar
katrincsak:24.8.2015 20:18
foreach($terminy as $termin)
{
        echo "
                <tr>
                        <th>".$termin['den']."</th>
                </tr>";

        foreach($zaky as $zak)
        {
                $test[] = "
                        <tr>
                                <td>".$zak['jmeno']."</td>
                                <td>".$zak['prijmeni']."</td>
                                <td>".$zak['popis']."</td>
                        </tr>";
                $i++;
        }

        for($a=0; $a < $i; $a++)
        {
                echo "<tr><td>".$test[$a]."</td></tr>";
        }
}

Jedině takto dokážu co jsem chtěl ... Vysypu přes foreach obsah do $test a pak už jen opakuji počtem.

Editováno 24.8.2015 20:19
 
Nahoru Odpovědět
24.8.2015 20:18
Avatar
solta
Člen
Avatar
solta:25.8.2015 12:53

Problém byl zakopán úplně někde jinde a to v metodě na získávaní dat z DB

public static function dotaz($sql, $parametry = array()) {
        $dotaz = self::$spojeni->prepare($sql);
        $dotaz->execute($parametry);
        return $dotaz;
    }
//mělo to být takto
public static function dotaz($sql, $parametry = array()) {
        $dotaz = self::$spojeni->prepare($sql);
        $dotaz->execute($parametry);
        return $dotaz->fetchAll();
    }
 
Nahoru Odpovědět
25.8.2015 12:53
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.