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

PHP PHP foreach -> Po vyprázdnění zopakovat. American English version English version

Avatar
katrincsak
Člen
Avatar
katrincsak:

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:

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:

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:

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:

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:

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:

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:

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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět 24.8.2015 19:03
Avatar
katrincsak
Člen
Avatar
Odpovídá na solta
katrincsak:

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:
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:

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.