Eurokicker
-


Hinweise


Antwort
 
LinkBack Themen-Optionen Thema durchsuchen
Alt 13.06.2007, 01:03   #1
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User

[PHP] Fallbeispiel für die Zerlegung eines Strings


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:
Code:
4 * 8 / 2 + 8 - 7
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 !
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten


Alt 13.06.2007, 02:39   #2
TP-Senior
 
Registriert seit: Feb 2006
Ort: Wien
Tropical ist auf einem guten Weg
Ganz nettes Beispiel, wen auch nicht wirklich praxisnah. Bei einem Taschenrechner bemühe ich lieber den PHP Parser anstatt mir selbst einen zu bauen.

Jedenfalls wars gut nachzuvollziehen, abgesehen davon das ich strcspn() noch nie wirklich gebraucht habe.
Tropical ist offline   Mit Zitat antworten
Alt 13.06.2007, 09:21   #3
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
Das ist richtig, einen kompletten Taschenrechner würde man anders aufbauen.
Mir gings mehr um ein einfaches Beispiel, um ein paar Techniken zu zeigen.
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Antwort

  Aktuelles Thema
  TP Hilfe Forum > Web-Editoren & Coding > Traum-Dynamik > Workshops und Tutorials
[PHP] Fallbeispiel für die Zerlegung eines Strings [Anfänger] [PHP] Fallbeispiel für die Zerlegung eines Strings
« [Workshop] Objektorientierte Programmierung in PHP | [Workshop] Typo3-Workshop Teil II - Bedienung und Handhabung »

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:59 Uhr.

Powered by: vBulletin Version 3.7 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd. / Search Engine Friendly URLs by vBSEO 3.2.0 ©2008, Crawlability, Inc.
Traum-Projekt.com | Suchen | Archiv | Impressum | Kontakt | | | Nach oben |



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67