Předvánoční slevová akce PHP týden
Pouze tento týden sleva až 80 % na PHP e-learning!
Využij předvánočních slev a získej od nás 20 % bodů zdarma! Více zde

Diskuze: Výpis rozvrhu do HTML tabulky v PHP

Aktivity (2)
Avatar
pgarsky
Člen
Avatar
pgarsky:28. října 16:33

Zdravím,
snažím se formovat rozvrh z údajů z databáze do 2D pole, a to potom vypisovat. Bohužel mi časy při výpisu přeskakují vedle (viz obrázek). Také bych potřeboval vypisovat aktivity do sloupců k jejich časům. Aktivity se totiž vypisují přímo za sebou a ne k příslušným časům.

Zkusil jsem: Takto vypadá struktura pole - print_r($time­table);

Array
(
    [0] => Array
        (
            [1] => 1:00
            [2] => 3:00
            [6] => 4:00
            [7] => 6:00
        )

    [1] => Array
        (
            [0] => Pondělí
            [1] => dfg
            [2] => dfg
        )

    [2] => Array
        (
            [0] => Úterý
            [1] => úterýden1
        )

    [3] => Array
        (
            [0] => Středa
        )

    [4] => Array
        (
            [0] => Čtvrtek
            [1] => Čtvrtekden
        )

    [5] => Array
        (
            [0] => Pátek
            [1] => pátekden
        )

    [6] => Array
        (
            [0] => Sobota
        )

    [7] => Array
        (
            [0] => Neděle
            [1] => neděleden2
            [2] => neděleden2
        )

)

Zdrojový kód celého souboru:

$query = "SELECT * FROM activities";
        $queryResult = mysqli_query($this->connection, $query);

        $timesQ = "SELECT time_from FROM activities";
        $timesR = mysqli_query($this->connection, $timesQ);


        $timetable = [
            [],
            ['Pondělí'],
            ['Úterý'],
            ['Středa'],
            ['Čtvrtek'],
            ['Pátek'],
            ['Sobota'],
            ['Neděle'],
        ];


        $times = [];
        $i = 1;
        $numberOfTimes = 0;
        while ($time = mysqli_fetch_assoc($timesR)) {
            $date = date("g:i", strtotime($time['time_from']));

            if (!in_array($date, $times)) {
                $timetable[0][0+$i] = $date;
                $numberOfTimes++;
                $times[] = $date;
            }

            $i++;
        }

        $activitiesQueryMon = "SELECT activity, time_from FROM activities WHERE day='Pondělí'";
        $activitiesQueryTue = "SELECT activity, time_from FROM activities WHERE day='Úterý'";
        $activitiesQueryWed = "SELECT activity, time_from FROM activities WHERE day='Středa'";
        $activitiesQueryThu = "SELECT activity, time_from FROM activities WHERE day='Čtvrtek'";
        $activitiesQueryFri = "SELECT activity, time_from FROM activities WHERE day='Pátek'";
        $activitiesQuerySat = "SELECT activity, time_from FROM activities WHERE day='Sobota'";
        $activitiesQuerySun = "SELECT activity, time_from FROM activities WHERE day='Neděle'";

        $activitiesResultMon = mysqli_query($this->connection, $activitiesQueryMon);
        $activitiesResultTue = mysqli_query($this->connection, $activitiesQueryTue);
        $activitiesResultWed = mysqli_query($this->connection, $activitiesQueryWed);
        $activitiesResultThu = mysqli_query($this->connection, $activitiesQueryThu);
        $activitiesResultFri = mysqli_query($this->connection, $activitiesQueryFri);
        $activitiesResultSat = mysqli_query($this->connection, $activitiesQuerySat);
        $activitiesResultSun = mysqli_query($this->connection, $activitiesQuerySun);

        $activities = [$activitiesResultMon, $activitiesResultTue, $activitiesResultWed, $activitiesResultThu, $activitiesResultFri, $activitiesResultSat, $activitiesResultSun];

        $k = 1; // sloupce
        $m = 1; // řádky
        for ($j = 0; $j < 7; $j++) {
            $l = mysqli_num_rows($activities[$j]);
            if ($l == 0) {
                $m++;
                $k = 1;
                continue;
            }
                while ($activity = mysqli_fetch_assoc($activities[$j])) {

                $cas = date("g:i", strtotime($activity['time_from']));
                $index = array_search($cas, $times);

                $timetable[0+$m][0+$k] = $activity['activity'];

                if ($k == $l) {
                    $m++;
                    $k = 1;
                } else {
                    $k++;
                }
            }
    }
        echo('<table class="schedule">
        <tbody>
        ');
        for ($i = 0; $i < 7 + 1; $i++) {
            echo('<tr>');
                // správně má být $numberOfTimes + 1, + 6 je z důvodu, aby bylo vidět, že časy se
                neztrácí, ale opravdu jen ujíždí
            for ($j = 0; $j < $numberOfTimes + 6; $j++) {
                echo('<td>' . $timetable[$i][$j] . '</td>');

            }
            echo('</tr>');
        }

        echo('
        </tbody>

        </table>');
    }

Chci docílit: Je nějaká možnost, jak psát aktivity přímo k příslušným časům a ne jen za sebou?

Jak opravit ujíždění časů v horní částí rozvrhu?

Děkuji předem za rady!

Editováno 28. října 16:34
Odpovědět
28. října 16:33
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
pgarsky
Člen
Avatar
pgarsky:28. října 16:35

Obrázek:

Nahoru Odpovědět
28. října 16:35
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:29. října 9:20

Nejsem si jisty, zda uplne chapu, v cem je problem. Mozna obrazek predtim, potom. Vubec, cely kod mas takovy divny, ze zvazuji, zda by nebylo lepsi pouzit google kalendar? Program pro cteni, editaci.

Spojeni ujizdeni casu nedava smysl. Kdyz delas skolni rozvrh, tak osa x ma 1, 2, 3, 4... osa y ma po, ut, st, ct, pa. Potrebujes docilit toho, aby mezi 1:00, 3:00, 4:00, 7:00 nebyly volne sloupce?
//$timetable[0][0+$i] = $date;
$timetable[0][] = $date; // uloz cas na posledni volnou polozku
$timetable[0][$da­te] = $date; // uloz to podle datumu
// oboje pocita to ale s tim, ze to z databaze mas uz serazene podle casu, ORDER BY cas ASC
// mimochodem, pokud je to cas, tak bych to nazval $time a ne $date

Ja bych pro rozvrh volil tabulku
x, y, text
0, 0, text
0, 1, text - a pri vypise doplnoval hodinu a den
day, time_start, text
0, 1:00, text
0, 4:00, text

 
Nahoru Odpovědět
29. října 9:20
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:29. října 9:24

Hlavne, kdyz chces data ziskat, tak staci 1 SELECT.
SELECT x, y, text FROM rozvrh ORDER BY y ASC
Pro zjednoduseni mozna jeste druhy, seznam vsech rozdilnych casu z tabulky
DISTINCT SELECT x FROM rozvrh ORDER BY x ASC

 
Nahoru Odpovědět
29. října 9:24
Avatar
pgarsky
Člen
Avatar
Odpovídá na Peter Mlich
pgarsky:29. října 19:46

Děkuji, z půlky je můj problém vyřešen. Teď je tu ještě ten problém, že se v poli řadí aktivity automaticky za sebou a ne podle časů. Tím pádem se tak vypisují i do rozvrhu. Je nějaká možnost, jak zařídit, aby se aktivity vypisovaly přímo k jejich časům?
Například, aktivita neděleden2 je od 4:00 a druhá aktivita neděleden2 je od 6:00 (viz obrázek databáze), ale v rozvrhu jsou od 1:00 a od 2:00 (viz rozvrh).

Editováno 29. října 19:47
Nahoru Odpovědět
29. října 19:46
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Lukáš
Redaktor
Avatar
Odpovídá na pgarsky
Lukáš:29. října 20:30

Toho seřazení docílíš pomocí ORDER BY, jak psal Peter výše.

 
Nahoru Odpovědět
29. října 20:30
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:30. října 7:43

//$timetable[0][0+$i] = $date;
$timetable[0][] = $date; // uloz cas na posledni volnou polozku
$timetable[0][$da­te] = $date; // uloz to podle datumu
Prvni radek, tos tam mel. Druhy radek je pridani na konec. dyz to seradis podle casu, tak to bude, jak ted mas na obrazku. Treti radek je ukladani podle casu. Jinymi slovy, pokud jsi to prepsal na db strukturu
id, x, y, texty, pak by tam melo byt

$query = "SELECT y, x, text FROM tabulka ORDER BY y ASC, x DESC"; // y je den v tydnu, x je hodina
...
while ($row = mysqli_fetch_assoc($result)!==false)
{
list ($y, $x, $text) = $row;
$timetable[$y][$x] = $text;
...

Ja osobne bych tam dal fakt x,y cislovane 0,1,2,3... Nebo kompletni datetime rok-mesic-den hodina:minuta a z nej to pak separoval. Nektere rozvrhy se delaji treba jen pro konkretni tyden.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět
30. října 7:43
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:30. října 7:49

A nebo bych to resil jeste dvema tabulkami

id, den
1, pondeli
...

id, hodina
1, 8:00
...

id, x, y, id_den, id_hodina, text
1, 0, 0, 1, 1, telocvik

SELECT x, y, den, hodina
FROM rozvrhy a
    LEFT JOIN dny  b ON b.id_den=a.id_den
    LEFT JOIN hodiny  c ON c.id_hodina=a.id_hodina
ORDER BY y ASC, x ASC
 
Nahoru Odpovědět
30. října 7:49
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Lukáš
Peter Mlich:30. října 7:53

Jestli to spravne chapu, tak jeho problem je nyni, ze mu to nudlickuje za sebou. Cili, nejspis tam ma kod
$tab[$radek][] = $text;
1 2 3
1 4 5 a potrebuje to mit ve spravnem sloupci
1 2 3 x x
1 x x 4 5
Jinymi slovy, je linej premyslet :)

 
Nahoru Odpovědět
30. října 7:53
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Peter Mlich
Peter Mlich:30. října 7:55

SELECT x, y, den, hodina
SELECT a.x, a.y, b.den, c.hodina, a.text
Mozna lepe pro pochopeni, si tam dej jmena tabulek; pri vice tabulkach by ten povodni zapis mohl vypsat sql error, protoze by mohly byt 2 sloupce stejne pojmenovane

 
Nahoru Odpovědět
30. října 7:55
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 10 zpráv z 10.