Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Arvojen erotuksen laskeminen

Sivun loppuun

creepy [12.10.2014 16:24:11]

#

Nyt tuli vaan ongelmaksi miten lasken php:llä arvojen erotuksen

esim
-1 ja 4
3 ja -2

pitäisi saada vastaukseksi
nousut 5
laskenut 5


Vai ajattelenko taas liian monimutkaisesti

peran [12.10.2014 17:48:14]

#

Toimisikohan kyseessä miinus operaattori ?

$x = -1 - 4 = -5;
$x = 3 - (-2) = 5;
if ($x<0) echo "nousut ".(-$x);
else if ($x==0) echo "pysynyt samana";
else echo "laskenut ".$x;

Vai mitä haet?

Loogisemmin toimivaksi saa vaihtamalla arvojen paikkaa, ja ehtolauseen operaattorin '>':ksi.

Eki++ [12.10.2014 17:57:11]

#

peran: eihän tuo edes toimi:

PHP kirjoitti:

Parse error: syntax error, unexpected '=' in your code on line 1

Et voi asettaa lausekkeen -1 - 4 arvoa miinus viideksi.

Edit: Toimivampi:

$lukua = -1;
$lukub = 4;
if($lukua < $lukub) {
	echo "Noussut " . ($lukub - $lukua);
}
else if($lukua > $lukub) {
	echo "Laskenut " . ($lukua - $lukub);
}
else {
	echo "Pysyi samana";
}

Tulostaa:

Noussut 5

peran [12.10.2014 18:12:50]

#

Eki++ kirjoitti:

peran: eihän tuo edes toimi: – –

No sen ei ollutkaan tarkoitus olla cut&paste-ratkaisu vaan suuntaa antava.

manninen [12.10.2014 21:38:07]

#

peran kirjoitti:

No sen ei ollutkaan tarkoitus olla cut&paste-ratkaisu vaan suuntaa antava.

suunnankin kannattaa olla toimiva :)

Eki++ [12.10.2014 22:58:47]

#

peran kirjoitti:

Eki++ kirjoitti:

peran: eihän tuo edes toimi: – –

No sen ei ollutkaan tarkoitus olla cut&paste-ratkaisu vaan suuntaa antava.

No anna sitten pseudoa tai ihan validia koodia. Toimimaton koodi jossa on logiikka pielessä ei auta ketään.

creepy [12.10.2014 23:23:15]

#

Kiitokset, Ekin tyylillä mennään. Ajattelin tuotakin hieman vaikeasti mutta tuohan osaa laskeskella negatiiviset yms ihan oikein..

Lebe80 [13.10.2014 09:16:23]

#

manninen kirjoitti:

peran kirjoitti:

No sen ei ollutkaan tarkoitus olla cut&paste-ratkaisu vaan suuntaa antava.

suunnankin kannattaa olla toimiva :)

Kyllähän jos sen silmän ottaa pois sieltä syvältä aanuksesta, näkee mitä peran tuossa tekee. Eli näyttää mistä luvut tulevat ihan laskukaavan turvin.

Hycke [13.10.2014 12:45:58]

#

Miksi et laske erotusta suoraan kyselyssä?
Jos oletetaan että id kentässä on juokseva numerointi niin kysely voisi mennä jotenkin näin:

select
	arvonyt.arvo as Arvonyt,
	arvoennen.arvo as ArvoEnnen,
	arvoennen.arvo - arvonyt.arvo as Erotus
from	taulu arvonyt
left outer join taulu arvoennen on arvoennen.id = arvonyt.id - 4
order by arvonyt.id desc limit 1

The Alchemist [13.10.2014 17:13:02]

#

Lebe80 kirjoitti:

manninen kirjoitti:

peran kirjoitti:

No sen ei ollutkaan tarkoitus olla cut&paste-ratkaisu vaan suuntaa antava.

suunnankin kannattaa olla toimiva :)

Kyllähän jos sen silmän ottaa pois sieltä syvältä aanuksesta, näkee mitä peran tuossa tekee. Eli näyttää mistä luvut tulevat ihan laskukaavan turvin.

Eihän se ole ollenkaan niin selvää, koska järkevän muotoilun sijaan on käytetty syntaktisesti rikkinäistä php:tä. Joko tehdään toimivaa koodia tai käytetään järkevää pseudotyyliä.

peran [13.10.2014 17:59:33]

#

The Alchemist kirjoitti:

Lebe80 kirjoitti:

manninen kirjoitti:

peran kirjoitti:

No sen ei ollutkaan tarkoitus olla cut&paste-ratkaisu vaan suuntaa antava.

suunnankin kannattaa olla toimiva :)

Kyllähän jos sen silmän ottaa pois sieltä syvältä aanuksesta, näkee mitä peran tuossa tekee. Eli näyttää mistä luvut tulevat ihan laskukaavan turvin.

Eihän se ole ollenkaan niin selvää, koska järkevän muotoilun sijaan on käytetty syntaktisesti rikkinäistä php:tä. Joko tehdään toimivaa koodia tai käytetään järkevää pseudotyyliä.

No, en ole muuttamassa tapaani vastata, mutta pitäähän syntaksillisesti virheelliset koodit muuttaa joka tapauksessa, sillä Ekinkin koodi antaa vaan vastauksena vakion:'Noussut 5', mikäli ei muuta tarvittaviksi muuttujia $lukua ja $lukub rivejä.

Lisäksi jos SQL:n avulla saa tiedot muuttujille, niin luulisi olevan tuttua muuttujan asetusformaatin olevan tuttua. Jos se ei ole selvää, niin silloin on turvallisinta pysyä web-sivujen ohjelmoinnista pois.

Tästä on saatu pikkuasiasta taifuuni vesilasiin.

Neuvottava ei kuitenkaan ollut täysin vasta-alkaja, joten aivojen käyttö on sallittu.

manninen [13.10.2014 18:14:25]

#

Lebe80 kirjoitti:

manninen kirjoitti:

peran kirjoitti:

No sen ei ollutkaan tarkoitus olla cut&paste-ratkaisu vaan suuntaa antava.

suunnankin kannattaa olla toimiva :)

Kyllähän jos sen silmän ottaa pois sieltä syvältä aanuksesta, näkee mitä peran tuossa tekee. Eli näyttää mistä luvut tulevat ihan laskukaavan turvin.

Kerrotko Lebe80, miten se silmä otetaan pois sieltä. Ei ole omakohtaista kokemusta, enkä osaa toimia ilman selkeitä ohjeita ;)

jalski [13.10.2014 20:47:45]

#

Kyllähän tuosta peran ensimmäisestä esimerkistä ratkaisu on suoraan nähtävissä.

PHP:ta en osaa, mutta tuosta saa suoraan kirjoiteltua selkeän REXX-toteutuksen:

suunta. = 0
suunta.0 = 'laskenut '
suunta.1 = 'noussut '

a = 3
b = -2

say suunta.[a < b] || abs(a - b)

creepy [15.10.2014 20:55:00]

#

Täällähän on keskustelua. Jokatapauksessa sain tuon toimimaan niinkuin halusin..

NYt aloin miettimään että miten saisin isommasta joukosta laskettua aina edellisen erotuksen..

Eli jos taulussa on

4
6
7
9
13
Niin pitäisi tulostaa 2 1 2 4

Pyörittelin tuossa aikani foreach looppia mutta ei nyt keksi miten sen edellisen tallentaisi yms ettei hyppäisi yli aina yhtä välistä.

Tässä tapauksessa luku kasvaa kokoajan

TEin tälläisen virityksen

<?

  $arvo2=0;
  foreach($dbh->query('select * from (SELECT * FROM taulu where anturi="ant" order by id desc LIMIT 25 offset 25) tmp order by tmp.id asc') as $row) {
    $arvo=$arvo2;
	if($arvo>0) {
	  $arvo=($row["arvo"]-$arvo)/10000;
	  echo $arvo.',';
	  $arvo2=$row["arvo"];
	}else{
      $arvo2=$row["arvo"];
    }
}
?>

peran [15.10.2014 21:34:29]

#

// Oletan, että saat itse muutettua luvut arrayksi. $luvut[]
$luvut=array(4,6,7,9,13);
$ex=$luvut[0];
for($i=1;$i<count($luvut);$i++)
{
    echo ($luvut[$i]-$ex)." ";
    $ex=$luvut[$i];
}

creepy [15.10.2014 21:49:43]

#

Ohoh, näyttää pikkusen yksinkertaisemmalta :)

peran [15.10.2014 21:54:08]

#

Sama foreach-lauseella:

// Oletan, että saat luvut arrayksi. $luvut[]
$luvut=array(4,6,7,9,13);
unset($ex);
foreach($luvut as $luku)
{
    if(isset($ex)) {
         echo ($luku-$ex)." ";
    }
    $ex=$luku;
}

Grez [15.10.2014 21:55:40]

#

Arrayta käyttäen edes apumuuttuja ei ole pakollinen, mutta tykkään enemmän tuosta foreach-ratkaisusta.

$luvut=array(4,6,7,9,13);
for($i=1;$i<count($luvut);$i++)
{
    echo ($luvut[$i]-$luvut[$i-1])." ";
}

Sivun alkuun

Vastaus

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

Tietoa sivustosta