NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: PHP vypocet dni medzi dvoma datumami a usporiadanie tabulky podla ostavajucich dni.

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

Aktivity
Avatar
martin.stiglinc
Tvůrce
Avatar
martin.stiglinc:5.3.2017 20:28

Ahojte,
pokusam sa vytvorit zoznam zoradený podla zostavajúcich dní do výrocia. Základom sú dáta vytiahnuté z databazy ktore obsahuju meno osoby, nazov vyrocia a datum vyrocia. Z datumu vyrocia potom vypocitam pocet zostavajucich dni do najblizsieho dátumu výrocia. Tieto dni pridelim k zvysnym datam a tieto vypisem html tabulky. Tabulku by som rad zoradil podla poctu ostavajucich dni. Toto sa mi vsak nedari nech robim cokolvek.

Data vytiahnute s databazy:

public function getAllEvents($user)
    {
        $allDatas = Db::queryAll('
                        SELECT event.event_name, event.event_date, user.name, CONCAT(COALESCE(people.people_name, ""), " ", COALESCE(people.people_nick, "")) AS person
                        FROM event
                        INNER JOIN people ON (event.people_id = people.people_id)
                        INNER JOIN user ON (people.user_id = user.user_id)
                        WHERE user.name = ?
                ', array($user));

        return $allDatas;
    }

Vypocet ostavajucich dni a doplnenie k zvysnym datam.

$today = new DateTime();

                foreach($allEvents as $key => $allEv)
                {
                        $allEvents[$key]['count_days'] = $this->changeYear($before = $allEv['event_date'])->diff($today);
                }

                private function changeYear($before)
        {

                $newDate = explode('-', $before);
                $newDate[0] = date("Y");
                $newDate = implode('-', $newDate);
                $now = date('Y-m-d');

                if ($newDate<=$now)
                {
                        $newDate = explode('-', $before);
                        $newDate[0] = date("Y") + 1;
                        $newDate = implode('-', $newDate);
                }

                $newDate = new DateTime($newDate);
                return $newDate;
        }

Vypis tabulky do HTML

<table id="count_days">

                                <?php foreach ($allEvents as $event) : ?>

                                        <tr>
                                                <td>
                                                        <h4><?= $event['person'] ?> má výročie <?= $event['event_name'] ?> za</h4>
                                                </td>
                                                <td>
                                                        <h4> <?= $event['count_days']->format('%a') ?> </h4>
                                                </td>
                                                <td>
                                                        <h4>dní.</h4>
                                                </td>
                                        </tr>

                                <?php endforeach ?>

                        </table>

Nech sa pokusam akokolvek neviem tabulku usporiadat podla zostavajucich dni. Skusal som to pred vypisom tabulky cez PHP sort array aj neskor uz po vytvoreni tabulky cez JavaScript - googlil com vsetko mozne ale neviem prist ako na to. Najblizsie som sa dostal zatial cez JavaScript avsak aj ten mi to usporiada ako by to bol text a nie cisla - skusal to pre istotu aj parsovat na int ale nic nepomaha

Tu je kod JavaScriptu.

var count_days, asc = 1;

window.onload = function () {
    count_days = document.getElementById("count_days");
}

function sort_table(table, col, asc) {
    var rows = table.rows,
        rlen = rows.length,
        arr = new Array(),
        i, j, cells, clen;
    // fill the array with values from the table
    for (i = 0; i < rlen; i++) {
        cells = rows[i].cells;
        clen = cells.length;
        arr[i] = new Array();
        for (j = 0; j < clen; j++) {
            arr[i][j] = cells[j].innerHTML;
        }
    }
    // sort the array by the specified column number (col) and order (asc)
    arr.sort(function (a, b) {

        return (a[col] == b[col]) ? 0 : ((a[col] > b[col]) ? asc : -1 * asc);
    });
    // replace existing rows with new rows created from the sorted array
    for (i = 0; i < rlen; i++) {
        rows[i].innerHTML = "<td>" + arr[i].join("</td><td>") + "</td>";
    }
}

Vedeli by ste mi niekto pomoct? Dakujem

Odpovědět
5.3.2017 20:28
Tomorow is the very first day of the rest of your life.
Avatar
Odpovídá na martin.stiglinc
Neaktivní uživatel:5.3.2017 20:45

Mělo by to jít udělat již přímo v databázi.

Spočteš si datum události tento rok a příští rok. Pak při řazení jen vybereš to nejbližší, které ještě nenastalo.

SELECT event.event_name, event.event_date, user.name, CONCAT(COALESCE(people.people_name, ""), " ", COALESCE(people.people_nick, "")) AS person,
event.event_date + INTERVAL(YEAR(CURRENT_TIMESTAMP) - YEAR(event.event_date)) + 0 YEAR AS currdate,
event.event_date + INTERVAL(YEAR(CURRENT_TIMESTAMP) - YEAR(event.event_date)) + 1 YEAR AS nextdate
FROM event
INNER JOIN people ON (event.people_id = people.people_id)
INNER JOIN user ON (people.user_id = user.user_id)
WHERE user.name = ?
ORDER BY CASE
        WHEN currdate >= CURRENT_TIMESTAMP THEN currdate
        ELSE nextdate
END

Inspirace z http://stackoverflow.com/a/7344307

Nahoru Odpovědět
5.3.2017 20:45
Neaktivní uživatelský účet
Avatar
martin.stiglinc
Tvůrce
Avatar
martin.stiglinc:5.3.2017 21:25

Dakujem :) tak toto ma absolutne nenapadlo. Velmi si mi pomohol.

Nahoru Odpovědět
5.3.2017 21:25
Tomorow is the very first day of the rest of your life.
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 3 zpráv z 3.