Ergebnis 1 bis 3 von 3

Thema: [PHP] Fallbeispiel für die Zerlegung eines Strings

  1. #1
    TP-Special Mod Avatar von steffenk
    Registriert seit
    Feb 2005
    Ort
    Haan / NRW
    Beiträge
    12.869

    [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

  2. #2
    TP-Senior
    Registriert seit
    Feb 2006
    Ort
    Wien
    Beiträge
    185
    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.

  3. #3
    TP-Special Mod Avatar von steffenk
    Registriert seit
    Feb 2005
    Ort
    Haan / NRW
    Beiträge
    12.869
    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

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

     

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

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