function kokoaTiedot($mode, $paiva, $kuukausi, $vuosi, $tunti) { ... for ($i = 0; $i < count($lines); $i++) { // käydään jokainen rivi läpi $data = explode("|", $lines[$i]); for ($j = 1; $j <= date("t", $kuukausi); $j++) { // ...jokaisen kuukauden päivän arvolla if (date("dnY", $data[0]) == $j.$kuukausi.$vuosi) { $maara++; // lisätään osuma jos sama arvo } } array_push($maara_top, $maara); // arrayhyn #$maara = 0; // <- katso tästä // määrä nollataan ennen seuraavaa silmukan kierrosta } rsort($maara_top, SORT_NUMERIC); // järjestetään arvot isoimmasta pienimpään return $maara_top[0]+(10-substr($maara_top[0], -1)); // takaisin arvo+matka seuraavaan kymmeneen ... }
Ongelmallinen koodi on tuossa.
Koodin pitäisi palauttaa suurin mahdollinen luku, joka jollekin päivälle osuu. Luvut luetaan tekstitiedostosta, jossa ne ovat muotoa ID||IP|, ja tuo ID on time()-funktion arvo, josta ratkotaan nuo päivät jne
Ongelma on, että nyt (kts. #-merkin kohdalta) koodi palauttaa kaikkien päivien arvot yhteensä, ja jos #-merkin ottaa pois, palauttaa pätkä aina luvun 1, vaikka arvo olisikin yli sen reippaasti.
Miten tätä siis pitäisi muuttaa että oikea arvo palautuisi?
Sen kummemmin koodia lukematta kysyisin, että onko tuossa if-lauseessa tämä kohta oikein: $j$kuukausi.$vuosi
jgz kirjoitti:
Sen kummemmin koodia lukematta kysyisin, että onko tuossa if-lauseessa tämä kohta oikein: $j$kuukausi.$vuosi
Näyttäisi puuttuvan tuosta $j:n lopusta piste.
Ei, se piste on sieltä jonnekin hukkunut tännekopioinin aikana
php.net kirjoitti:
Day of the month, 2 digits with leading zeros
Tämä siis date funktion parametristä d. eli jos muuttujan $j arvo on esim. 1 ja date antaa 01 niin silloin if lause ei ainakaan toteudu, vaikka luultavasti sen pitäisi.
jgz kirjoitti:
php.net kirjoitti:
Day of the month, 2 digits with leading zeros
Tämä siis date funktion parametristä d. eli jos muuttujan $j arvo on esim. 1 ja date antaa 01 niin silloin if lause ei ainakaan toteudu, vaikka luultavasti sen pitäisi.
Kiitos tiedosta. Mutta tuo ei ainakaan muuttanut koodin käyttäytymistä mitenkään
No joo, hioin koodia ja nyt se toimii melkein:
... for ($i = 0; $i < count($lines); $i++) { $data = explode("|", $lines[$i]); for ($j = 1; $j <= date("t", $kuukausi); $j++) { if (date("jnY", $data[0]) == $j.$kuukausi.$vuosi) { if (date("j", $data[0]) == $maara_top[count($maara_top)-1][0]) { $maara_top[count($maara_top)-1][1]++; } else { array_push($maara_top, array(date("j", $data[0]), $maara)); $maara_top[count($maara_top)-1][1]++; } } } } array_multisort($maara_top[1], SORT_ASC, $maara_top, SORT_DESC); return $maara_top[0][1];#+(10-substr($maara_top[0][1], -1)); ...
Kuten koodista näkyy, arrayt kasataan
Array ( [0] => Array ( [0] => 12 // päivä [1] => 59 // päivän lukema ) [1] => Array ( [0] => 13 [1] => 195 ) [2] => Array ( [0] => 14 [1] => 159 ) [3] => Array ( [0] => 15 [1] => 28 ) [4] => Array ( [0] => 16 [1] => 103 ) ...
näin. Mutta tuo array_multisort ei järjestele noita arvoja toisen välin ( [1] ) mukaan, kun en keksi, miten tuo array_multisort pitäisi kirjoittaa, joten koodi palauttaa aina tuon ensimmäisen arvo, eli 59, joka ei kylläkään ole selvästikään suurin
Käypä katsomassa apua tuohon array_multisortiin vaikka täältä https://www.ohjelmointiputka.net/koodivinkit/
Kiitokset samlui:lle linkistä ja ajv:lle esimerkistä, nyt toimii kun sovelsin sitä foreach-pätkää omaan koodiin
Tajusin juuri, että PHP sisältää funktion nimeltään array_count_values, joka tekee suurinpiirtein tuon saman parilla rivillä koodia, minkä oma koodini tekee
Aihe on jo aika vanha, joten et voi enää vastata siihen.