Autor Zpráva
jtfcobra
Profil
Prosím o radu jak zjistit že stroj

Když je nula v posledním sloupci tak stroj běží.
Potřeboval bych vyčíst
že stroj běžel od
14:00-14:30 celkem 30 minu
15:00-16:30 celkem 90 minu
atd...


1903,"0.308","Pilat","2016-07-15","16:54:04","16.3","0.02","17.1","1"
1904,"0.308","Pilat","2016-07-15","16:54:14","16.3","0.02","17.1","1"
1905,"0.308","Pilat","2016-07-15","16:54:24","16.3","0.02","17.1","1"
1906,"0.308","Pilat","2016-07-15","16:54:34","16.3","0.02","17.1","1"
1907,"0.308","Pilat","2016-07-15","16:54:44","16.2","0.02","17.1","1"
1908,"0.316","Pilat","2016-07-15","16:54:54","16.3","1.47","17.1","0"
1909,"0.323","Pilat","2016-07-15","16:55:04","16.5","1.43","17.1","0"
1910,"0.330","Pilat","2016-07-15","16:55:14","16.9","1.49","17.1","0"
1911,"0.337","Pilat","2016-07-15","16:55:24","17.3","1.44","17.1","0"
1912,"0.343","Pilat","2016-07-15","16:55:34","18.0","1.44","17.0","0"
1913,"0.349","Pilat","2016-07-15","16:55:44","18.6","1.22","17.0","1"
1914,"0.349","Pilat","2016-07-15","16:55:55","19.2","0.02","17.0","1"
1915,"0.349","Pilat","2016-07-15","16:56:05","19.7","0.02","17.1","1"
1916,"0.349","Pilat","2016-07-15","16:56:15","20.1","0.02","17.1","1"
1917,"0.349","Pilat","2016-07-15","16:56:25","20.4","0.02","17.0","1"
1918,"0.349","Pilat","2016-07-15","16:56:35","20.7","0.02","17.0","1"
1919,"0.349","Pilat","2016-07-15","16:56:45","21.0","0.02","17.0","1"
1920,"0.349","Pilat","2016-07-15","16:56:55","21.1","0.02","16.9","1"
1921,"0.349","Pilat","2016-07-15","16:57:05","21.3","0.02","17.0","1"
1922,"0.349","Pilat","2016-07-15","16:57:15","21.6","0.02","17.0","1"
1923,"0.354","Pilat","2016-07-15","16:57:25","21.7","1.41","17.0","0"
1924,"0.361","Pilat","2016-07-15","16:57:35","22.0","1.44","17.0","0"
1968,"0.644","Pilat","2016-07-15","17:04:59","48.0","1.49","17.6","0"
1969,"0.650","Pilat","2016-07-15","17:05:09","48.4","1.42","17.6","0"
1970,"0.656","Pilat","2016-07-15","17:05:19","48.7","1.42","17.6","0"
1971,"0.663","Pilat","2016-07-15","17:05:29","49.1","1.42","17.6","0"
1972,"0.664","Pilat","2016-07-15","17:05:39","49.4","0.02","17.7","1"
1973,"0.664","Pilat","2016-07-15","17:05:49","49.7","0.02","17.6","1"
1974,"0.664","Pilat","2016-07-15","17:05:59","49.9","0.02","17.6","1"
1975,"0.664","Pilat","2016-07-15","17:06:09","50.1","0.02","17.5","1"
1976,"0.664","Pilat","2016-07-15","17:06:19","50.2","0.02","17.5","1"
1977,"0.664","Pilat","2016-07-15","17:06:29","50.3","0.02","17.5","1"
1978,"0.664","Pilat","2016-07-15","17:06:40","50.4","0.02","17.5","1"
1979,"0.664","Pilat","2016-07-15","17:06:50","50.5","0.02","17.5","1"
Enko
Profil
Ahoj,
pokud ti jde jen o to zjistit jestli je poslední číslo nula nebo jedna a máš vždy stejný počet hodnot v řádku, tak můžeš použít například funkci explode();
blaaablaaa
Profil
jtfcobra:
Mozna bude existovat lepsi reseni, ale postupne prochazej data a pokud se zmeni 0 na 1, poznac si, kdy se tak stalo, pokud 1 na 0, spocitej si mezi temi casy rozdil a mas to ...
Tomášeek
Profil *
jtfcobra:
Data jsou odkud? Z databáze? Ze souboru?

Z databáze to je snadné, tam si snadno vybereš jen data, která mají na konci nulu a pokud na sebe časy navazují, sečteš je.

Pokud v souboru (a tedy poli), pak:
- je pole vícerozměrné (tedy, co řádek, to 1. úroveň polí, co hodnota oddělená čárkou, to druhá úroveň polí). Pak by ta hodnota byla v $array[$i][8]
- je jednorozměrné a to, co ukazuješ, je co řádek, to jeden string. Pak hodnotu získáš pomocí substr($row, -2, 1)

Enko:
Explode bude zbytečně pomalý v tomto případě, tedy oproti substru, pokud se bavíme o stringu.
Keeehi
Profil
Pokud jsou ty data v souboru vypadají jako csv, tak na jejich čtení bude skvělá funkce fgetcsv
jtfcobra
Profil
je to v databazi

vubec ted netusim jak to napsat v php ?


potrebuji abych vedel ze to bezel treba v 10 pak treba v 13 atd
Tomášeek
Profil *
jtfcobra:
V tom případě si vytáhni jen záznamy, které mají na konci 0 nebo 1, co potřebuješ (to bys snad zvládnout měl).

Pak ty záznamy procházej, klasicky whilem jako jakákoliv jiná databázová data.

Mohlo by to být nějaký takto, snad tam není nějaká logická chyba, psal jsem to v rychlosti (nechtějí se mi tvořit vzorové struktury dat).

$con->query("...");

$i = 0;
$intervals = array();
while ($row = $con->fetch_assoc()) {
    if ($i == 0) {
        // prvni nastaveni dat
        $od = $row['od'];
        $do = $row['od'];
    } else {
        if ($row['od'] == strtotime($do . ' + 10 second')) {
            // pokud na sebe data navazuji, posun hranici 'do'
            $do = $row['od'];
        } else {
            // vznikla mezera, ulozime si do pole $intervals vysledny interval
            $intervals[] = array($od, $do);

            // novy zacatek, konec
            $od = $row['od'];
            $do = $row['od'];
        }
    }

    $i++;
}

print_r($intervals);
jtfcobra
Profil
Udelal jsem to takle ale nejfunguje to

Pise to chybu v tomhle radku:
$intervals = array();

$db = mysql_connect($hostname_test, $username_test, $password_test);
mysql_select_db($database_test,$db);
$con = mysql_query("SELECT * FROM d136223_pilat.data where MONTH(datum) = Now() and YEAR(datum) =  Now()  and DAY(datum) =  Now()  and  zarizeni='Pilat'",$db);
$row = mysql_num_rows($con);
$i = 0;
$intervals = array();
while ($row = $con->fetch_assoc()) {
    if ($i == 0) {
        // prvni nastaveni dat
        $od = $row['od'];
        $do = $row['od'];
    } else {
        if ($row['od'] == strtotime($do . ' + 10 second')) {
            // pokud na sebe data navazuji, posun hranici 'do'
            $do = $row['od'];
        } else {
            // vznikla mezera, ulozime si do pole $intervals vysledny interval
            $intervals[] = array($od, $do);
 
            // novy zacatek, konec
            $od = $row['od'];
            $do = $row['od'];
        }
    }
 
    $i++;
}
 
print_r($intervals);

mysql_close($db);
Tomášeek
Profil *
jtfcobra:
Samozřejmě, tohle fungovat nebude a nemůže. Protože...

... protože jednak na ř. 4 máš nesmyslnou proměnnou, která obsahuje jen číslo, počet řádků, který je k ničemu (to je jen logická chyba, nikoliv programová). A druhak, a to zejména, absolutně nechápeš (= zkopíroval jsi bez rozmyslu) řádek 7.

Zatímco já jsem použil objektový přístup mysqli, tys ho smotal dohromady s mysql, což samozřejmě fungovat nebude.

Už o vlákno vedle jsem napsal, aby sis nastudoval nějaký základ toho, co děláš, jinak to nemá cenu. Do to doby, než na sobě nezačneš pracovat, s nápovědami a radami končím (mimochodem, dal jsem ti prakticky kompletní kód, který nejsi s to zpracovat).
Enko
Profil
Tomášeek:
Explode bude zbytečně pomalý v tomto případě, tedy oproti substru, pokud se bavíme o stringu.
Děkuji za reakci. Máš prosím nějaký konkrétní příklad včetně měření časů? O jak moc to bude pomalé? Zajímá mě to, jestli v tom bude nějaký výrazný rozdíl, protože explode() používám celkem často a pokud je nějaké lepší řešení, rád si nechám poradit.
Tomášeek
Profil *
Enko:
Pomalý ve smyslu, že na jedné operaci to samozřejmě nepoznáš, ale globálně bude (dobře, ne pomalý, ale) pomalejší. Časy si snadno změříš sám.

Už jen, když si vezmeš, co ty funkce dělají je celkem logické, která bude rychlejší.

1. substr: máš string, najdi x-tý znak, od něj odpočítej dalších pár. Zbytek tě nezajímá. Porovnej.
2. explode: projdi string od začátku do konce, znak po znaku. Porovnej n-tý znak s delimiterem. Naplň pole. Vyber z pole x-tý prvek. Porovnej.
Kcko
Profil
Tomášeek:
V tomhle případě ta zátěž není vůbec vidět, spíš mě děsí dotaz typu
where MONTH(datum) = Now() and YEAR(datum) =  Now()  and DAY(datum) =  Now()
Tj. bez indexů ...
Tomášeek
Profil *
Kcko:
Jasně, píšu, že na jedné operaci je to časově nastejno, resp. neměřitelné. Jen jsem chtěl Enka upozornit, že používat explode všude, jak sám uvedl, není best practice. Někde se hodí jiné funkce k dosažení (vizuálně) totožného výsledku.

Co se toho SQL dotazu týče, to je kapitola sama pro sebe. K tomu jsem se raději (navíc, jak jsem dříve avizoval) nevyjadřoval. Přiznám se, že z hlavy ani nevím (a teď nemám kde vyzkoušet), jestli je zápis MONTH(datum) = NOW() vůbec validní. Ale na toto odpovídat nemusíš, to bylo jen řečnicky, pak si to někdy vyzkouším.
Alphard
Profil
Tomášeek [#7]:
Před tímhle přístupem bych varoval, to je podle mě návrhově chybně. Ta idea, že navazující záznamy jsou od sebe 10 s se zřejmě nebude slučovat s realitou. Jestli si pamatuji, co tady jtfcobra dlouhodobě řeší, tak jde o analýzu logů z nějakých měřáků spotřeby. Nesázel bych na to, že tam bude real time operační systém, který fakt odešle data každých 10 s a navíc tam máš síť a server to bude přijímat frontově. Koukni na záznamy:
1913,"0.349","Pilat","2016-07-15","16:55:44","18.6","1.22","17.0","1"
1914,"0.349","Pilat","2016-07-15","16:55:55","19.2","0.02","17.0","1"
a
1977,"0.664","Pilat","2016-07-15","17:06:29","50.3","0.02","17.5","1"
1978,"0.664","Pilat","2016-07-15","17:06:40","50.4","0.02","17.5","1"
Je tam +11 s, ale řekl bych, že patří k sobě.

Určitě bych kontroloval s předchozím záznamem + by se to mělo vyrovat s chybějícími daty.


Spíše pro zajímavost, umím si představit, že by se ta data přímo vytáhla z databáze. Ten dotaz bych stavěl tak, že dám vedle sebe původni sadu dat a data posunutá o jeden řádek a vyberu ty, kde se nerovná sloupec stav. Tady jsem zkoušel takovou hračku sqlfiddle.com/#!9/710b0/1, ale visí to na konstrukci t1.id = t2.id-1... Musel bych mít zaručený validní mechanismus, jak se odkázat o jeden řádek zpět.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0