PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Archive for the ‘Arithmetik’ tag

Eine Rechenaufgabe lösen mit PHP

with 47 comments

Ich bastle gerade an einem kleinen Script, das aus einer Reihe Zahlen und arithmetischen Operatoren eine Rechenaufgabe erstellt und löst. Die Rechenaufgabe besteht nicht nur aus Additionen oder Subtraktionen, sondern enthält im einfachen Beispiel auch Multiplikationen, wobei dann auf die Punkt-vor-Strichrechung geachtet werden muss, was das ganze doch etwas erschwert.

Zuerst Beispielcode, damit ihr versteht was ich vorhabe:

<?php

$numbers = array(5, 19, 45, 6, 7, 21);
$operators = array('*', '+', '-', '*', '+');

// String bauen
$mathString = '';
foreach ($numbers as $id => $number) {
    if ($id < count($numbers)-1) {
        $mathString .= $number . $operators[$id];
    } else {
        $mathString .= $number;
    }
}
// $mathString ist nun '5*19+45-6*7+21'

Nun ist die Aufgabe, aus dem String $mathString das Ergebnis auszurechnen. Die einfachste und schnellste Lösung ist natürlich eval() (oder vergleichbare Funktionen wie create_function() oder assert() ). Folgender Code löst die Rechenaufgabe und gibt das Ergebnis aus:

eval('echo ' . $mathString . ';');

Wenn man nun eval() und Konsorten nicht benutzen möchte oder darf oder kann, wie lautet dann der PHP Code, um eine solche Rechenaufgabe zu lösen? Die beiden oben gezeigten Arrays sind natürlich nur Beispiele, der Algorithmus sollte auch mit anderen Zahlen funktionieren.

Folgende Dinge sind zu beachten:

  • $numbers ist ein Array aus unbekannt vielen Zahlen. Im einfachen Fall nur positive Zahlen, im etwas schwierigeren Fall auch negative
  • $operators beinhaltet so viele Operatoren wie nötig sind für die Rechnung (also  count($numbers)-1 viele). Um es nicht allzu komplex zu machen beschränken wir uns auf die Addition, Subtraktion und Multiplikation (+, – und *)
  • Es gilt die Punkt vor Strichrechung zu beachten
  • In unserem Fall hier kommen keine Klammern vor.

Wie sieht das ganze nun aus wenn auf die einfache, aber unschöne eval() Lösung verzichtet wird? eval() ist deshalb unschön weil die Zahlen und Operatoren oder gar der ganze $mathString aus Usereingaben kommen könnten, dann muss man sehr gut filtern um keine Sicherheitslücke beim Einsatz von eval() zu erstellen. Oder auf manchen Systemen ist eval() sogar verboten (disabled_functions).

Written by Michael Kliewe

Mai 30th, 2011 at 8:32 am

Posted in PHP

Tagged with , ,