Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP taulun läpikäynti

Sivun loppuun

javerkki [30.01.2009 11:46:54]

#

Tervehdys.

Nyt tarvitsisin apua PHP:n taulukoiden läpikäynnissä.

Eli haen tietokannasta seuraavasti tietoja

arvo-aikajana   oma
101              0
108              0
110              1
140              1
170              0
180              1
190              0

Nyt vien arvot PHP:n tauluhin

arvot[] ja omat[]

arvot taulussa on arvoja, jotka ovat kasvavassa järjestyksessä. eli seuraava tietue on aina suurempi tai yhtäsuuri, kuin edellinen.

Nyt voin laskea tietueiden erotukset:

101-108 = 7
108-110 = 2
110-140 = 30
jne...

Mutta ongelmaksi tulee se, että minun pitäisi aina erotuksen kohdalla katsoa, että oliko erotuksen kohdalla
jompikumpi tai kummatkin oma-tietueen arvot 1

Haluan saada erotus-laskusta tietoon vain arvot, jotka ei ole omia.

oma=1 (ei ole oma)

Jos jompikumpi oma-arvo on 1, niin erotuksesta pitäisi vähentää puolet (½) ja ottaa arvo talteen, mutta jos

kummankin tietueen oma-arvot oln 1, niin sitten erotus tulos otettaisiin talteen kokonaan.


Eli tässä rautalanka esimerkki, mitä yritän tehdä:

arvo-aikajana oma
101            0 |
108            0 | Erotus on 7, mutta kumpikin oma=0 eli ei oteta arvoa talteen

108            0 |
110            1 | Erotus 2, mutta toinen on oma=1, eli 2/1=1 joten talteen otetaan tuo 1

110            1 |
140            1 | Erotus 30 ja molemmat oma=1, joten talteen tuo 30

140            1 |
170            0 |Erotus 30, mutta toinen oma=1, eli 30/2=15 talteen tuo 15

170            0 |
180            1 |Erotus 10, mutta toinen oma=1, eli 10/2=5 joten talteen 5

180            1 |
190            0 |Erotus 10, mutta toinen oma=1, eli 10/2=5 joten talteen 5

Eli minun pitäisi PHP ohjelmassa saada tietoon tuo luku 56.
eli: 1+30+15+5+5 = 56

Miten tälläinen onnistuisi ?
Itseltäni loppuu taidot.

Mod. edit: siirretty oikealle alueelle

tsuriga [30.01.2009 12:08:15]

#

summat = []

edellinen = [0,0]
käy_läpi(tiedot as tieto)
    summat[tieto[1] + edellinen[1]] += tieto[0] - edellinen[0]
    edellinen = tieto

summa = summat[1]/2 + summat[2]

Jossa tiedot on kaksiulotteinen taulukko, joka siis sisältää taulukoita, jotka koostuvat arvosta ja oma-bitistä.

javerkki [30.01.2009 13:37:14]

#

Kiitos tsuriga vastauksesta.

Kun katson koodia, niin otetaanko tuossa tosiaan se huomioon, että
jos jompikumpi oma-arvo on =1, niin silloin erotus puolitetaan ja tulos otetaan talteen.

Tai jos molemmat on oma-arvot on 1, niin silloin ei puoliteta erotusta vaan kokoarvo menee talteen ?

Tai jos molemmat oma-arvot on 0, niin silloin ei oteta arvoa ollenkaan talteen ?

Se ei minun taidoilla onnistu.

tsuriga [30.01.2009 14:17:13]

#

Otetaan, tuossa lopussa: summat[1]/2. summat[0] on niitä, joissa oma-arvot ovat molemmat nollia (oma-arvojen summa 0), summat[1], joissa toinen oma-arvo on 1 (eli summa 1) ja summat[2], joissa molemmat oma-arvot ovat 1 (summa 2).

Koodasin pseudokoodini ajatellen sellaista suositellun mukaista tilannetta, jossa tietokantaoperaatiot on eristetty toiminnoista ja ulkoasusta (MVC), ja arvot saadaan jotenkin mystisesti tuossa formaatissa. Reaalitilanteessa:

javerkki [30.01.2009 14:48:18]

#

Kiitos tsuriga.

Alan kirjoittelemaan koodia.

javerkki [02.02.2009 10:59:12]

#

Sain tosiaankin homman toimimaan, kun loin kaksiulotteisen taulukon ja laitoin arvot sinne 'käsin,',

mutta nyt tosiaan on sellainen tapaus, että haen kannasta tiedot ja en nyt ihan ymmärrä, miten saisin laitettua tiedot oikeisiin taulukon soluihin kyselyn jälkeen:

$tiedot = array();

$kysely="SELECT arvoAikaja, oma FROM taulu where...";
$tulos = mysql_query($kysely);

while ($row = mysql_fetch_assoc($tulos)){

//kuinka saisin loopattua tulokset tauluun seuraavasti:

$tiedot[0][0] = $row['arvoAikajana'];
$tiedot[0][1] = $row['oma'];

$tiedot[1][0] = $row['arvoAikajana'];
$tiedot[1][1] = $row['oma'];
jne...

}

tsuriga [02.02.2009 11:14:31]

#

Tuossahan ne jo onkin, $tiedot[1] on tuossa sama kuin pseudossa edellinen. Ennen silmukkaa sille alustus nollatauluksi ja silmukassa väliin summaus. Selkeyden vuoksi nimeäisin muuttujat eri tavalla.

javerkki [02.02.2009 12:28:38]

#

Hei tsuriga.

Nyt taisin tipahtaa kärryiltä.
ainakaan nyt ei tule oikeaa tulosta, kun kokeilin tällätavalla:

$summat = array();
$edellinen = array();
$edellinen[0]=0;


while ($row = mysql_fetch_assoc($tulos)){

 foreach ($row as $tieto) {

   $summat[$tieto[1] + $edellinen[1]] += $tieto[0] - $edellinen[0];
    $edellinen = $tieto;

$summa = $summat[1]/2 + $summat[2];

}

}

Taisin ymmärtää jotain väärin ?

tsuriga [02.02.2009 12:38:54]

#

<?php

$edellinen = array(0,0);
while...
    $summat[$row['oma'] + $edellinen['oma']] += ...
    $edellinen = $row // .., row, row your boat, gently down the stream
?>

javerkki [02.02.2009 13:17:22]

#

Anteeksi, mutta aivot ei nyt oikein toimi (jos koskaan)

$summat = array();
$edellinen = array(0,0);

while ($row = mysql_fetch_assoc($tulos)){


 foreach ($row as $tieto) {

$summat[$row['oma'] + $edellinen['oma']] += $tieto[0] -   $edellinen[0];

$edellinen = $row;

$summa = $summat[1]/2 + $summat[2];
}

}

// Merrily, merrily, merrily, merrily Up and down the stream

Nyt saan virheitä:

Undefined offset:  0
Undefined offset:  1
Undefined offset:  2

tsuriga [02.02.2009 13:31:47]

#

Ota foreach pois, while on jo se haluamasi silmukkarakenne. Ja summat[0], summat[1] ja summat[2] on myös toki hyvä alustaa nolliksi, ettei tule noita Undefined offset huomautuksia.

Grez [02.02.2009 13:43:44]

#

Mä en kyllä ymmärrä miksi se pitää tehdä noin vaikeasti. Eikö seuraava riittäisi?

<?php
$summa = 0;
$kysely="SELECT arvoAikaja, oma FROM taulu where...";
$tulos = mysql_query($kysely);
if ($edellinen = mysql_fetch_assoc($tulos)) {
  while ($row = mysql_fetch_assoc($tulos)) {
    $summa += ($row['arvoAikaja']-$edellinen['arvoAikaja'])
        *($row['oma']+$edellinen['oma'])/2;
    $edellinen = $row;
  }
}
?>

tsuriga [02.02.2009 14:04:06]

#

Jeps, parempihan tuo, ei tarvitse erillistä väliaikaismuuttujaa.

javerkki [03.02.2009 14:26:09]

#

Kiitos tsuriga ja Grez !


Sivun alkuun

Vastaus

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

Tietoa sivustosta