Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP: silmukoita ja arvon nollaus

Sivun loppuun

nixu89 [15.06.2006 14:47:42]

#

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?

jgz [15.06.2006 15:01:02]

#

Sen kummemmin koodia lukematta kysyisin, että onko tuossa if-lauseessa tämä kohta oikein: $j$kuukausi.$vuosi

Draiz [15.06.2006 15:29:38]

#

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.

nixu89 [15.06.2006 15:30:19]

#

Ei, se piste on sieltä jonnekin hukkunut tännekopioinin aikana

jgz [15.06.2006 15:51:45]

#

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.

nixu89 [16.06.2006 10:59:46]

#

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

nixu89 [18.06.2006 08:48:58]

#

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

samlui [18.06.2006 11:16:37]

#

Käypä katsomassa apua tuohon array_multisortiin vaikka täältä https://www.ohjelmointiputka.net/koodivinkit/24587-php-tiedostolistaus-array-multisortilla

nixu89 [18.06.2006 20:25:03]

#

Kiitokset samlui:lle linkistä ja ajv:lle esimerkistä, nyt toimii kun sovelsin sitä foreach-pätkää omaan koodiin

nixu89 [19.06.2006 11:32:55]

#

Tajusin juuri, että PHP sisältää funktion nimeltään array_count_values, joka tekee suurinpiirtein tuon saman parilla rivillä koodia, minkä oma koodini tekee


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta