IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
pgarsky
Člen
Avatar
pgarsky:28.10.2019 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.10.2019 16:34
Odpovědět
28.10.2019 16:33
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
pgarsky
Člen
Avatar
pgarsky:28.10.2019 16:35

Obrázek:

Nahoru Odpovědět
28.10.2019 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.10.2019 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.10.2019 9:20
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:29.10.2019 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.10.2019 9:24
Avatar
pgarsky
Člen
Avatar
Odpovídá na Peter Mlich
pgarsky:29.10.2019 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.10.2019 19:47
Nahoru Odpovědět
29.10.2019 19:46
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
Lukáš
Tvůrce
Avatar
Odpovídá na pgarsky
Lukáš:29.10.2019 20:30

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

 
Nahoru Odpovědět
29.10.2019 20:30
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:30.10.2019 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í
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
30.10.2019 7:43
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:30.10.2019 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.10.2019 7:49
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Lukáš
Peter Mlich:30.10.2019 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.10.2019 7:53
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Peter Mlich
Peter Mlich:30.10.2019 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.10.2019 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.