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
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ä.
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.
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:
mysql_queryn
jälkeen: pseudon voi pyöräyttää sen silmukan ympärille, eli tieto[1] olisi esim. rivi['arvo-aikajana'].foreach(taulu as avain => arvo)
-menetelmää.Kiitos tsuriga.
Alan kirjoittelemaan koodia.
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... }
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.
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 ?
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
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.
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; } } ?>
Jeps, parempihan tuo, ei tarvitse erillistä väliaikaismuuttujaa.
Kiitos tsuriga ja Grez !
Aihe on jo aika vanha, joten et voi enää vastata siihen.