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: výpočty v tabulce

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

Aktivity
Avatar
martin.vip
Člen
Avatar
martin.vip:13.6.2016 9:07

Ahoj, php se teprve učím a dělám si aplikaci na přehled tankování u auta... do tabulky ukládám datum, stav_km, litry a cenu. Ve výpisu mám přidán sloupec s ujetýma_km a průměrem. Tuto tabulku plním přes příkaz

while($radek=mysqli_fetch_array($result))

Nevím jestli jsem zvolil vhodný způsob výpisu, nevím si rady jak docílit toho, aby se mi ve sloupci v každém řádku spočetly ujeté km mezi tankováním a průměrná spotřeba

pomůžete mi někdo nasměrovat?

Díky

Editováno 13.6.2016 9:08
 
Odpovědět
13.6.2016 9:07
Avatar
saša harvan
Člen
Avatar
 
Nahoru Odpovědět
13.6.2016 9:54
Avatar
martin.vip
Člen
Avatar
martin.vip:13.6.2016 10:43

Jo to je varianta pro součty, ale do pole stav_km ukládám stav pocitadla km při tankování. Tzn. Odecist predchozi stav km od aktualniho stavu

 
Nahoru Odpovědět
13.6.2016 10:43
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovídá na martin.vip
Jindřich Máca:14.6.2016 2:02

Ahoj, nezlob se na mě, ale to jsi doplnil až teď...

Já být Tebou, tak sem nejdříve pořádně rozepíšu, co chceš vlastně udělat, případně co a jak se tam počítá. Klidně můžeš uvést i větší část kódu a pokud je to tabulka, tak názorný obrázek s popisy by vůbec neuškodil. Teprve potom Ti tu bude někdo schopen patřičně pomoci. ;)

 
Nahoru Odpovědět
14.6.2016 2:02
Avatar
martin.vip
Člen
Avatar
martin.vip:14.6.2016 7:01

Nic jsem nedoplnoval, dotaz je polozen od zacatku porad stejne. Ale cim vic nad tim premyslim tak tim vic si myslim ze timto cyklem while to nepude.

 
Nahoru Odpovědět
14.6.2016 7:01
Avatar
martin.vip
Člen
Avatar
martin.vip:14.6.2016 8:21

tady je obrázek aby byl dotaz pochopen... potřeboval bych spočítat sloupec Ujeto km... tzn. odečíst řádek ID 12 - 11 ; 11-10 ; 10 - 9

data jsou vymyšlená jen pro potřeby vyvoje

 
Nahoru Odpovědět
14.6.2016 8:21
Avatar
martin.vip
Člen
Avatar
martin.vip:15.6.2016 10:44

nikdo nevíte jak na to? ještě by byla možnost ukládat počáteční a konečný stav ale to bych nechtěl... napadlo mě vždy hodnotu toho řádku uložit do pom. proměnné a pak v dalším cyklu to odečíst, což jde, ale potřeboval bych to hodit o řádek výš... viz obrázek

 
Nahoru Odpovědět
15.6.2016 10:44
Avatar
David Hynek
Tvůrce
Avatar
Odpovídá na martin.vip
David Hynek:15.6.2016 15:42

Průměrnou spotřebu můžeš počítat pouze když vezmeš plnou. Tak je myšleno to dokankovávání třeba po těch 5 - 10 litrech? Průměrnou spotřebu můžeš spočítat vždy jen zpětně k minulému tankování. Tedy, když máš 0 km najeto a vezmeš plnou, a při druhém tankování opět vezmeš plnou, můžeš ze stávajícího množství najetých kilometrů vypočítat průměrnou spotřebu. V tom případě, ti bohatě stačí, si vytvořit proměnou, která ti podrží stav tachometru z předchozího řádku tabulky, pak rozdíl mezi stávajícím stavem vydělíš množstvím tankovaného paliva. ALE. Musí to být fakt plná nádrž. Protože, když najedu 1000 km na plnou nádrž a pak natankuji jen 5 litrů. Těžko můžu mít spotřebu 0,5l/100km. Otázkou tedy je, zda výpočet průměrné spotřeby je položka, kterou můžeš seriozně počítat. Respektive, smysl by to mělo co se týká dlouhodobé spotřeby. Tedy, třeba z pohledu měsíční spotřeby, nebo roční. To už je na tobě...

Nahoru Odpovědět
15.6.2016 15:42
Čím víc vím, tím víc věcí nevím.
Avatar
martin.vip
Člen
Avatar
Odpovídá na David Hynek
martin.vip:15.6.2016 16:23

já tankuji vždy do plné... takže to je v pohodě... spíš mě šlo o to jak docílit toho aby se počítaly ujeté km mezi tankováním

 
Nahoru Odpovědět
15.6.2016 16:23
Avatar
David Hynek
Tvůrce
Avatar
Odpovídá na martin.vip
David Hynek:15.6.2016 17:02

Tedy ta pomocná proměnná. Co ti přenese údaj do dalšího řádku...

Nahoru Odpovědět
15.6.2016 17:02
Čím víc vím, tím víc věcí nevím.
Avatar
martin.vip
Člen
Avatar
Odpovídá na David Hynek
martin.vip:15.6.2016 17:15

jo to už mám, ale potřeboval bych ty ujeté km posunout o řádek výš... mrkni na obrázek

 
Nahoru Odpovědět
15.6.2016 17:15
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na martin.vip
Jakub Žák:15.6.2016 17:44

Zkus sem hodit ten kód, kterej generuje to na obrázku.

Nahoru Odpovědět
15.6.2016 17:44
Kuba je ajťák. Buď jako Kuba.
Avatar
martin.vip
Člen
Avatar
martin.vip:15.6.2016 17:59

zde je zdroj

<?php
        $select = "SELECT * FROM tankovani order by stav_km desc";
        $result = mysqli_query($con, $select);
        $ujeto=0;
        $prumer=0;
        $litru_celkem=0;
        $prumer_cena= 0;
        $pocet = mysqli_num_rows($result);
        $pomoc = 0;
        while($radek=mysqli_fetch_array($result)){
            $ujeto = $pomoc - $radek[2];
            echo "<tr><td>".htmlspecialchars($radek[0])."</td>"; //id
            echo "<td>".date("d.m.Y",strtotime($radek[1]))."</td>"; //datum

            echo "<td>".htmlspecialchars($radek[2])."</td>";//poc stav
            echo "<td>".htmlspecialchars($ujeto)."</td>"; //ujeto celkem mezi jednotlivými tankováními


            echo "<td>".htmlspecialchars($radek[3])."</td>"; //

            echo "<td>".htmlspecialchars($radek[4])."</td>"; //

            //kod pro výpočet průměrné spotřeby za období

            echo "<td>".htmlspecialchars($prumer)."</td>"; //
            echo "<td>".htmlspecialchars($radek[5])."</td>"; //
            echo "<td>".htmlspecialchars($radek[6])."</td></tr>"; //

            $litru_celkem+= $radek[3];
            $prumer_cena += $radek[4];
            $sum = $prumer_cena/$pocet;
            $pomoc = $radek[2];

        }


        echo "<tr><td colspan=9 bgcolor='#a52a2a'></td></tr>";
        echo"<tr><td>Celkem: " .$pocet."</td>";
        echo"<td></td>";
        echo"<td></td>";
        echo"<td>". $ujeto."</td>";
        echo"<td>".$litru_celkem."</td>";
        echo"<td>Průměr: ".$sum."</td>";
        echo"<td>".$prumer. "</td>";
        echo"<td></td>";
        echo"<td></td></tr>";
        ?>

        </tbody>
    </table>
 
Nahoru Odpovědět
15.6.2016 17:59
Avatar
Jakub Žák
Člen
Avatar
Jakub Žák:15.6.2016 18:35

Takže v "ujeto km" na prvním řádku by mělo být 100? Potom to asi takhle jednoduše přes takovou pomocnou proměnnou nepůjde.

Nahoru Odpovědět
15.6.2016 18:35
Kuba je ajťák. Buď jako Kuba.
Avatar
martin.vip
Člen
Avatar
Odpovídá na Jakub Žák
martin.vip:15.6.2016 18:39

přesně tak... taky si myslím že to bude chtít něco sofistikovanějšího, proto taky tady žádám o pomoc... napadá tě něco?

 
Nahoru Odpovědět
15.6.2016 18:39
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na martin.vip
Jakub Žák:15.6.2016 18:46

Žádný pěkný řešení mě aktuálně nenapadá, ale napadlo mě třeba ukládat si do pole hodnoty, který chci vypsat a vypsat to až v dalším průchodu (a potom samozřejmě poslední řádek vypsat po konci cyklu, protože v cyklu k němu nedojdeš).

(tzn. že v prvním průchodu cyklu se jen uloží hodnoty a nic se nevypíše, ve druhým průchodu cyklu se vypíše druhý řádek, v posledním průchodu cyklu se vypíše předposlední řádek a po cyklu se vypíše poslední)

Editováno 15.6.2016 18:49
Nahoru Odpovědět
15.6.2016 18:46
Kuba je ajťák. Buď jako Kuba.
Avatar
martin.vip
Člen
Avatar
martin.vip:15.6.2016 18:55

když jsem začal s programováním ve vb.net dělal jsem stejnou app, a tam to bylo vcelku v pohodě.. dalo se říct, že chci procházet řádek-1, ale tady v PHP to asi nejde co?

šlo by to projít cyklem for() a tam s tím nějak pracovat

 
Nahoru Odpovědět
15.6.2016 18:55
Avatar
Jakub Žák
Člen
Avatar
Jakub Žák:15.6.2016 19:30
<?php
$select = "SELECT * FROM tankovani order by stav_km desc";
$result = mysqli_query($con, $select);
$ujeto = 0;
$prumer = 0;
$litru_celkem = 0;
$prumer_cena = 0;
$pocet = mysqli_num_rows($result);
$pomoc = 0;

$vypis = array();
$pruchod = 0;

while ($radek = mysqli_fetch_array($result)) {

    if ($pruchod > 0) {
        echo "<tr><td>" . $vypis["id"] . "</td>"; //id
        echo "<td>" . $vypis["datum"] . "</td>"; //datum
        echo "<td>" . $vypis["km"] . "</td>";//poc stav
        echo "<td>" . ($pomoc - $vypis["ujeto"]) . "</td>"; //ujeto celkem mezi jednotlivými tankováními
        echo "<td>" . $vypis["litry"] . "</td>"; //
        echo "<td>" . $vypis["litr"] . "</td>"; //
        //kod pro výpočet průměrné spotřeby za období
        echo "<td>" . $vypis["prumer"] . "</td>"; //
        echo "<td>" . $vypis["misto"] . "</td>"; //
        echo "<td>" . $vypis["poznamka"] . "</td></tr>"; //
    }

    $vypis["id"] = htmlspecialchars($radek[0]); // ID
    $vypis["datum"] = date("d.m.Y", strtotime($radek[1])); // Datum
    $vypis["km"] = htmlspecialchars($radek[2]); // Kilometry
    $vypis["ujeto"] = ""; // Ujeto km
    $vypis["litry"] = htmlspecialchars($radek[3]); // Litry
    $vypis["litr"] = htmlspecialchars($radek[4]); // Cena za litr
    $vypis["prumer"] = htmlspecialchars($prumer); // Průměr/100
    $vypis["misto"] = htmlspecialchars($radek[5]); // Místo
    $vypis["poznamka"] = htmlspecialchars($radek[6]); // Poznámka

    $litru_celkem += $radek[3];
    $prumer_cena += $radek[4];
    $sum = $prumer_cena / $pocet;
    $pomoc = $radek[2];

    $pruchod++;

}

echo "<tr><td colspan=9 bgcolor='#a52a2a'></td></tr>";
echo "<tr><td>Celkem: " . $pocet . "</td>";
echo "<td></td>";
echo "<td></td>";
echo "<td>" . $ujeto . "</td>";
echo "<td>" . $litru_celkem . "</td>";
echo "<td>Průměr: " . $sum . "</td>";
echo "<td>" . $prumer . "</td>";
echo "<td></td>";
echo "<td></td></tr>";
?>

</tbody>
</table>

Něco takovýho třeba?

(chybí tam ještě ten poslední průchod za cyklem)

Editováno 15.6.2016 19:31
Nahoru Odpovědět
15.6.2016 19:30
Kuba je ajťák. Buď jako Kuba.
Avatar
martin.vip
Člen
Avatar
Odpovídá na Jakub Žák
martin.vip:15.6.2016 19:37

jo už jsem to nějak zkouším podle tvého nápadu... vyzkouším a dám vědět jak to dopadlo :-) díky moc

 
Nahoru Odpovědět
15.6.2016 19:37
Avatar
David Hynek
Tvůrce
Avatar
Odpovídá na martin.vip
David Hynek:15.6.2016 22:56

Nedalo mi to. Předpokládám, že zadaná data jsou orientační (spotřeba vychází podle zadaných dat, která jsem okopíroval do pole)

<?php
        /* sloupce tabulky
        0 - datum
        1 = stav km
        2 = tankovano
        3 = cena PHM
        4 = sloupec pro pocet najetych km od minuleho tankovani / doplneno cyklem
        5 = misto tankovani
        6 = sloupec pro prumer spotreby
        */

        $data = array(
        13 => array("17.6.2016",1400,40,29.9,0,"Brno",0),
        12 => array("17.6.2016",1300,50,26,0,"Blucina",0),
        11 => array("17.6.2016",310,2,31,0,"",0),
        10 => array("17.6.2016",300,5,20,0,"",0),
        9 => array("4.6.2016",250,5,25,0,"Brno",0),
        8 => array("1.6.2016",0,20,25,0,"Brno",0),
        );
        ksort($data);
        $predchozi = 0; // pomocna promenna
        $predchozi2 = 0; // pomocna promenna

        foreach($data as $key => $radek){
            $data[$key][4] = $radek[1] - $predchozi; //najeto
            $ujeto = $radek[1] - $predchozi; //ujeto od minuleho tankovani
            $data[$key][6] = round(($predchozi2>0)?($predchozi2 / ($ujeto / 100)):0,2);  //prumer
            $predchozi = $radek[1];  //pomocna promenna pro kilometry
            $predchozi2 = $radek[2]; //pomocna promenna pro prumernou spotrebu
        }

        krsort($data);
        echo "<style>td, th {border-collapse: collapse; border: 1px solid #000; }</style><table style='border-collapse: collapse'>
        <tr><th>ID</th><th>Datum</th><th>Stav km pri tankovani</th><th>Najeto od minula</th><th>Tankovano</th><th>Prumer spotreba</th><th>Cena</th><th>Místo</th>";
        foreach($data as $key => $radek)
        {
        echo "<tr><td>$key</td><td>$radek[0]</td><td>$radek[1]</td><td>$radek[4]</td><td>$radek[2]</td><td>$radek[6]</td><td>$radek[3]</td><td>$radek[5]</td></tr>";
        }
        echo "<tr><td>Celkem polozek: ".count($data)."</td><td></td><td></td><td></td><td>Tankovano celkem: ".array_sum(array_column($data,2))."</td><td>Prumerna spotreba: ".(array_sum(array_column($data,6))/count($data))."</td><td></td><td></td></tr></table>";

?>

Výsledná tabulka pak vypadá takto:

Editováno 15.6.2016 22:57
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
15.6.2016 22:56
Čím víc vím, tím víc věcí nevím.
Avatar
martin.vip
Člen
Avatar
Odpovídá na David Hynek
martin.vip:16.6.2016 6:15

Ahoj ano data jsou vymyslena... Ale super prace. Takhle by to melo vypadat... Vcera jsem na to uz nemel silu, dnes to snad dotahnu... Diky vsem

 
Nahoru Odpovědět
16.6.2016 6:15
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 21 zpráv z 21.