Elikästä tuo kertookin jo lähes kaiken. Minulla on string-tyypin muuttuja $muuttuja jonka sisältö on tuo "2*x"
Nyt minulla on vaikka muuttuja $x = 5 jonka haluasisin $muuttujaan kirjaimen x tilalle ja sitten laskea kaikki laskutoimitukset. Mitenkäs tämä onnistuu? Yritin laittaa ihan str_replacella ensin x:n tilalle tuon $x:n ja sitten muuttaa muuttujan tyyppiä intiksi/floatiksi mutta ei onnistu.
Tieten purkalla onnistuu, mutta varmasti tähän on järkeväkin tapa toteuttaa tämä.
Kiitos, evalhan se oli se funktio jota hain.
En tuosta tiedä mutta jos kyseessä ei olisi string muuttuja niin homma menisi kai näin.
<?php $x = 5; $a = 2*$x; echo $a; ?>
Ja aina eval-funktion kanssa pitää muistaa, että sille ei saa antaa suoraan käyttäjän kirjoittamaa tekstiä. Tarkistuksen täytyy olla toimiva ja täydellinen. Muuten voi käydä huonosti, jos kuka tahansa pääsee suorittamaan PHP-koodia palvelimella.
Ja pää on tyhjä. PHP:ssä ei ole jotain funktiota joka vain toteuttaisi stringistä matemaattiset lauseet? Tuntuu että tuon evalin käyttö ei tulekaan kysymykseen kun tätä olisi tarkoitus käyttää julkisesti. Kaipa sitä sitten pitää alkaa itse parsimaan erilaisia laskutoimituksia noista stringeistä vaikka explodella. Tosin se ei tule olemaan kovinkaan helppoa.
Oman laskulausekkeen laskijan tekeminen on ehkä paras ratkaisu, mutta myös työläin. Silloin saa juuri semmoisen kuin tarvitsee. Ja PHP:n kaltaisella kielellä tekeminen ei ole kovin vaikeaa. Aivan käyttökelvoton evalkaan ei ole, mutta laskulauseke täytyy tarkistaa huolellisesti ennen suoritusta. Kiellettyjen merkkien poistaminen auttaa jo paljon. Tosin eval-funktio ei tunne sen enempää matemaattisia merkintöjä kuin PHP:kaan. Esim. potenssit ja muuttujien edessä olevat kertoimet eivät toimi. Nämä voi tosin korvata laskussa sopiviksi ennen evalin käyttöä.
<?php function laskestring($laskutoimitus, $luku, $muuttuja = "x") { $laskutoimitus = preg_replace("/([0-9.]+)$muuttuja/", "\\1 * $luku", $laskutoimitus); //Muunnos 2x muodoista 2*x muotoihin $laskutoimitus = preg_replace("/$muuttuja/", $luku, $laskutoimitus); //x muunnetaan luvuksi $laskutoimitus = preg_replace("/([0-9.]+)[ ]?\^[ ]?([0-9.]+)/e", "pow(\\1, \\2)", $laskutoimitus); //Potenssit $laskutoimitus = preg_replace("/([0-9.]+)[ ]?\\*[ ]?([0-9.]+)/e", "\\1 * \\2", $laskutoimitus); //Kertomiset $laskutoimitus = preg_replace("/([0-9.]+)[ ]?\\/[ ]?([0-9.]+)/e", "\\1 / \\2", $laskutoimitus); //Jakamiset while (strpos($laskutoimitus, "+") or strpos($laskutoimitus, "-")) { $laskutoimitus = preg_replace("/^[ ]?([0-9.]+)[ ]?(\\+|\\-)[ ]?([0-9.]+)/e", "\\1 \\2 \\3", $laskutoimitus); //Vähennykset ja ynnäykset $c++; if ($c > 1000) //Varohätä jos jokin menee pieleen niin 1000 kierroksen jälkeen lopetetaan break; } return $laskutoimitus; } ?>
Tuollaisen väköstelin. Jos nyt joku vaikka tälläistä joskus kaipaisi... Jos jotain sanottavaa löytyy niin ne otetaan kiitollisina vastaan. Aiheesta on tulossa kyllä koodivinkkikin ehkä lähiaikoina.
Edit:
Löytyihän siitä virheitä ihan omastakin takaa... Näemmä bugittaa jossakin yli 9 suuremmilla kertoimilla/luvuilla...
Edit:
Korjattu. Ja nyt nukkumaan -->
Aihe on jo aika vanha, joten et voi enää vastata siihen.