Diskuze: výpočty v tabulce

PHP PHP výpočty v tabulce American English version English version

Avatar
martin.vip
Člen
Avatar
martin.vip:

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. června 9:08
 
Odpovědět 13. června 9:07
Avatar
martin.vip
Člen
Avatar
martin.vip:

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. června 10:43
Avatar
Jindřich Máca
Tým ITnetwork
Avatar
Odpovídá na martin.vip
Jindřich Máca:

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. června 2:02
Avatar
martin.vip
Člen
Avatar
martin.vip:

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. června 7:01
Avatar
martin.vip
Člen
Avatar
martin.vip:

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  +1 14. června 8:21
Avatar
martin.vip
Člen
Avatar
martin.vip:

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  +1 15. června 10:44
Avatar
David Hynek
Redaktor
Avatar
Odpovídá na martin.vip
David Hynek:

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. června 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:

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  +1 15. června 16:23
Avatar
David Hynek
Redaktor
Avatar
Odpovídá na martin.vip
David Hynek:

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

Nahoru Odpovědět 15. června 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:

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. června 17:15
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na martin.vip
Jakub Žák:

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

 
Nahoru Odpovědět 15. června 17:44
Avatar
martin.vip
Člen
Avatar
martin.vip:

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. června 17:59
Avatar
Jakub Žák
Člen
Avatar
Jakub Žák:

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. června 18:35
Avatar
martin.vip
Člen
Avatar
Odpovídá na Jakub Žák
martin.vip:

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. června 18:39
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na martin.vip
Jakub Žák:

Žá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. června 18:49
 
Nahoru Odpovědět  +1 15. června 18:46
Avatar
martin.vip
Člen
Avatar
martin.vip:

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. června 18:55
Avatar
Jakub Žák
Člen
Avatar
Jakub Žák:
<?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. června 19:31
 
Nahoru Odpovědět  +1 15. června 19:30
Avatar
martin.vip
Člen
Avatar
Odpovídá na Jakub Žák
martin.vip:

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  +1 15. června 19:37
Avatar
David Hynek
Redaktor
Avatar
Odpovídá na martin.vip
David Hynek:

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. června 22:57
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 15. června 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:

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. června 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.