[PHP] Typen-Problem

fliegenkiller

Lt. Junior Grade
Registriert
März 2005
Beiträge
387
Hallo ich habe folgendes Problem:
In meinem Script gibt es da einen String, der die folgende Form hat:
PHP:
$string = "x*x";
Durch ersetzten der x durch die variable '$x' und anschliessender evaluierung, wird der String zum folgenden umgewandelt:
PHP:
$string = "2*2"; // Zahlen spielen keine Rolle
Der String hat nun immer noch den Typ "string".
Wie kann ich jetzt das Programm dazu bringen, mir den String auszurechnen?
PHP:
echo $string; // gibt 2*2 aus.
//Sollte aber 4 ausgeben

Vielen dank für deine Hilfe,
 
Mit Strings rechnet man auch nicht :) Das ist pfusch.

Wenn dann macht man das so:
PHP:
function testRechne($string) {
	$matches = array();
	if(preg_match('/([0-9]+)([\-\+\*\/])([0-9]+)/', $string, $matches)) {
	    switch($matches[2]) {
	        case '*':
	        	return $matches[1]*$matches[3];
	        	
	        case '+':
	        	return $matches[1] + $matches[3];
	        
	        default:
	        	exit("Rechenart nicht erkannt");
	    }
	}
}

echo testRechne("99+1");
 
also dein prob ist, das in php variablen nicht expiliziet angegeben werden:

$string = "2*2"; // Zahlen spielen keine Rolle

alles was in "..." steht wird von php als string definiert, wie du auch deine variable genannt hast

gibts du z.B.

$string = 2*2; an dann lautet die ausgabe 4 da jetzt die variable $string ein inttyp ist.

ich weiß zwar nicht genau was du machen möchtest aber ich schätzmal du willst erst in die variable ein matheformel (z.B.: x*x + y) packen und dann einfach die werte x und y setzen und das ergebnis erhalten?

das geht so direckt nicht, da php keine funktionale sprachen ist, eventuell gibts da nen speziellen befehl, der dir das bastellt. ich persönlich würd einfach ne funktion schreiben die ungefähr so aussieht

function xmalx($X)
{
$erg = $X*$X;
echo"$erg";
}

xmalx(6);

ausgabe 36
 
Enigma schrieb:
Mit Strings rechnet man auch nicht :) Das ist pfusch.

Wenn dann macht man das so:
PHP:
function testRechne($string) {
	$matches = array();
	if(preg_match('/([0-9]+)([\-\+\*\/])([0-9]+)/', $string, $matches)) {
	    switch($matches[2]) {
	        case '*':
	        	return $matches[1]*$matches[3];
	        	
	        case '+':
	        	return $matches[1] + $matches[3];
	        
	        default:
	        	exit("Rechenart nicht erkannt");
	    }
	}
}

echo testRechne("99+1");

Ich weiss, dass man nicht mit einem String rechnen sollte. Es ist nun so: Der Benutzer kann mittels Formular eine Rechnung eingebe, in dieser Form: y= x*x+8*x-18
Nun, die Rechnung wird über die GET Parameter übertragen.
1 variable + Konstanten.
das heisst, der Benutzer kann auch diese Rechnung eingeben: x*x+x+38489-x+x*x*x [...]
der Rechnungsstring wird so formatiert, dass er nachner die Form: $x*$x+$x [...] hat.
PHP:
$string = "$x+$x*$x+1234-$x*$x*$x";
jetzt sollte ich PHP dazubringen den String auzurechnen.
Kann ich das mit einem Array versuche? indem ich den String mit dem Seperator x in ein Array verwandle?
 
Dein gewünschter Workflow:
Input -> Hier geschiet ein Wunder -> Ergebnis

Leider ist das "Hier geschiet ein Wunder" nicht in PHP implementiert. PHP kann nicht jeden beliebigen Ausdruck in einem String auswerten. Das Wunder musst du selber Programmieren - d.h.: String Parsen und die Logik die im String vorgegeben ist auswerten.

Edit: Bzw das Wunder in Google suchen :)
 
Na toll...
Vielleicht finde ich eine andere Lösung... Danke für eure Antworten.
 
ok das wird nicht ganz einfach.
ansatz du muß den kompletten string parsen zeichen für zeichen $string[n] für 0<=n <= max und dabei jedes stringelement auswerten und festlegen ob es ein rechnoperrator eine variable oder eine konstante ist.

und dir dann die formel zusammen fummeln.

bzw. hab nochmal nachgedacht, es geht vieleicht einfacher wenn du dir nen regulären ausdruck baust, dass geht ganz gut mit php und dann einfach den deterministischen endlichen automaten auswertest, der fängt dir auch eventuelle falscheingaben ab.
 
Zuletzt bearbeitet:
Enigma schrieb:
Leider ist das "Hier geschiet ein Wunder" nicht in PHP implementiert.

aber sicher doch:

php.net/eval
 
Das man eval jedoch auf gar keinen Fall verwenden sollte, wenn das Programm auch nur halbwegs sicher sein soll ist dabei aber auch klar, dass es solche Schweinereien wie eval() gibt ist mir unverständlich (man denke hier nur mal an die zahllos vorhandenen Möglichkeiten einen Exploid einzuschleusen).
Ich hab noch nie ein Programm gesehen wo eval wirklich nötig wäre (jetzt nicht allein auf php bezogen) fast immer kann das mit einem etwas intelligenteren Design vermieden werden.

Ein Beispiel was dann als String übergeben werden könnte, zwar harmlos aber da könnten auch ganz andere Dinge drin stehen.
PHP:
$string = '$n = 2*2; echo $n . " hello world!";';
eval( $string );

Also bitte bitte niemals eval verwenden wenn man nicht genau weiss worauf man sich einlässt.
 
das mit dem eval() habe ich schon ausprobiert, es funktionierte leider nicht so wie ich es gewollt hatte
 
Zurück
Oben