An einem Beispiel will ich zeigen, wie man einen String zerlegen kann und mit ihm was durchführen kann.
In diesem Fallbeispiel geht es um einen kleinen Rechner, der eine Anweisung parst und dann berechnet (nur Grundrechenarten).
Beispiel:
Das Ergebnis sollte also 17 sein - mal schauen obs klappt
Um den String zu zerlegen, planen wir ein Array, das wir zum berechnen verwenden. Das Array soll so aussehen (die erste Zahl muss ja addiert werden, also nehmen wir das + als ersten Operator), das jedes Element aus einem Array mit Operator und Zahl besteht.
So sähe unser Array aus:
Code:
Array
(
[0] => Array
(
[0] => +
[1] => 4
)
[1] => Array
(
[0] => *
[1] => 8
)
[2] => Array
(
[0] => /
[1] => 2
)
[3] => Array
(
[0] => +
[1] => 8
)
[4] => Array
(
[0] => -
[1] => 7
)
)
fangen wir also mit dem Zerlegen an.
Hier hilft uns die Funktion
strcspn. Sie vergleicht 2 Strings und die liefert die Anzahl der Zeichen des ersten Strings,
bis ein Zeichen vom zweiten String vorkommt.
Dieser zweite String beinhaltet also alle Trennzeichen: */+-
PHP-Code:
$ausgangsString = '4 * 8 / 2 + 8 - 7';
$trennZeichen = '+-*/';
# unser Zielarray
$zielArray = array();
#der erste Operator ist ein Plus
$operator = '+';
Nun wollen wir unseren String zerlegen und in das Array eintragen:
PHP-Code:
#jetzt zerlegen in einer Schleife
while($ausgangsString) {
#Länge bis zum ersten Trennzeichen ermitteln
$laenge = strcspn($ausgangsString,$trennZeichen);
#diese als string speichern (unsere erste Zahl)
$zahl=substr($ausgangsString,0,$laenge);
#zum Array hinzufügen
$zielArray[] = array(
$operator, # [0]
trim($zahl) # [1] die Zahl ohne Leerzeichen
);
#den nächsten Operator merken
$operator = substr($ausgangsString,$laenge,1);
#den geparsten Teil des Ausgangsstrings können wir nun abschneiden
$ausgangsString = substr($ausgangsString,$laenge + 1); # zahl und nächsten Operator
}
Die Schleife wird solange durchlaufen, wie es noch Zeichen im Ausgangsstring gibt, das erledigt am Anfang die Abfrage
while($ausgangsString)
substr liefert den Teilstring zurück, die drei parameter bedeuten
- Ausgangsstring
- ab welcher Stelle, angefangen mit 0
- wieviele zeichen ab dort (optional, ohne diesen Parameter bis zum Ende)
An dieser Stelle sollte unser Array korrekt gefüllt sein, wir können das uns mal ausgeben lassen:
PHP-Code:
echo '<pre>'.print_r($zielArray,true).'</pre>';
Wenn alles korrekt ist, müssen wir nur noch das Array durchlaufen und mitrechnen
PHP-Code:
$ergebnis = 0;
#wir durchlaufen die Hauptelemente des Arrays
foreach($zielArray as $element) {
echo "Zwischenergebnis vorher $ergebnis, ";
if($element[0] == '+') $ergebnis += $element[1];
if($element[0] == '-') $ergebnis -= $element[1];
if($element[0] == '*') $ergebnis *= $element[1];
#beim Dividieren müssen wir auf 0 aufpassen
if($element[0] == '/') {
if($element[1]) $ergebnis /= $element[1];
}
echo "nach $element[0] $element[1] = $ergebnis <br>";
}
echo "<br>Unser Endergebnis lautet $ergebnis";
Hier kommt eine Kurzschreibweise, die ich sehr passend finde.
statt
$a = $a + 4;
kann man auch schreiben
$a += 4;
Das wars schon. Dieses Beispiel soll als Anregung dienen, um ähnliches mit Zeichenketten durchzuführen.
Ich habe bewusst die lineare Schreibweise benutzt, normalerweise würde man das in Funktionen auslagern.
Auch habe ich deutsche Variblennamen benutzt, im Normalfall werden englische Namen benutzt.
Viel Spass beim ausprobieren / nachvollziehen / experimentieren !