kostenloser Webspace werbefrei: lima-city


PHP Vor- und Rechenzeichen (-)

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    tft-development

    Kostenloser Webspace von tft-development

    tft-development hat kostenlosen Webspace.

    ich möchte meine Rechnung
    z.Bsp. $data = "20--1-3"
    in ein array zerlegen, da geht am besten mit dem Regulären Ausdruck:
    preg_match_all
    preg_match_all('/(-?\d+)|([\(\)\-\*\/+])/',$data,$splitdata);

    die Ausgabe am Beispiel würde dann allerdings so aussehen:
    Array
    (
        [0] => 20
        [1] => -
        [2] => -1
        [3] => -3
    )


    umgedreht geht es auch nicht:
    preg_match_all('/([\(\)\-\*\/+]|(-?\d+))/',$data,$splitdata);

    Array
    (
        [0] => 20
        [1] => -
        [2] => -
        [3] => 1
        [4] => -
        [5] => 3
    )


    ich möchte aber Zahlen mit Vorzeichen (wie bei -1) in einem String und Rechenzeichen (also das - vor der 3) in einem eigenen string haben
    Array
    (
        [0] => 20
        [1] => -
        [2] => -1
        [3] => -
        [4] => 3
    )


    wie bekomme ich das hin, hat jemand eine Idee? wäre nett von euch :)
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Ist das eine Art Testaufgabe oder wäre es eine Möglichkeit, vorher die "--" durch "+" zu ersetzen (analog "+-" zu "-", bis keine zwei Rechenzeichen mehr hintereinander stehen)?

    Beitrag zuletzt geändert: 6.9.2013 20:46:47 von tavern
  4. mach halt ein
    str_replace_all('--','+',$var);

    davor
  5. j*********b

    Die -- durch + ersetzen ist eine gute Idee,

    evtl. verwende mehrdimensionale Arrays.
  6. Hallo alle zusammen,

    bevor hier noch mehr Antworten kommen, die versuchen mit viel Halbwissen eine Lösung mit regulären Ausdrücken zu finden will ich intervenieren.

    Die Aufgabenstellung kann man zwar mit regulären Ausdrücken lösen, allerdings ist die Lösung eher unschön und nicht mehr sehr übersichtlich.

    Besser ist es die Zeichenkette durch einen Parser zu schicken, dieser ist zwar erstmal langsamer aber die Geschwindigkeit nimt maximal linear zu. Diese Annahme kann man von einem regulären Ausdruck nicht annehmen.

    Ein Parser, welcher die gestellte Aufgabe löst sieht z.B. etwa so aus:
    function parse($string)
    {
        $result = array();
        $string = trim($string);
        $stringAsArray = str_split($string);
        $buffer = ''; 
        for($i=0,$end=count($stringAsArray);$i<$end;$i++){
            $local = $stringAsArray[$i];
            $last = $i > 0 ? $stringAsArray[$i-1] : '+';
            if(!ctype_digit($local)){
                if($buffer != ''){
                    $result[] = $buffer;
                }   
                if(ctype_digit($last)){
                    $result[] = $local;
                    $buffer = ''; 
                }else{
                    $buffer = $local;
                }   
            }else{
                $buffer .= $local;
            }   
        }   
        $result[] = $buffer;
        return $result;
    }
    
    $result = parse('20--1-3');
    print_r($result);
    Der gezeigte Code kann noch erheblich verbessert werden, z.B. durch eine flexiblere Abfragelogik, aber er erfüllt die gegebene Aufgabenstellung.

    Groß getestet habe ich den Code jedoch auch nicht.

    Mit freundlichen Grüßen
  7. Autor dieses Themas

    tft-development

    Kostenloser Webspace von tft-development

    tft-development hat kostenlosen Webspace.

    ich habs schon gelöst,
    1. ich splitte mein string mit preg_match() in ein array --> -2*(30*-2) ----> -,2,*,(,30,*,-,2,)
    2. ich durchsuche den string nach "-"zeichen ( indem ich einen $counter hochzähle)
    3. habe ich eins gefunden, prüfe ich ob der Wert vor dem "-" eine Zahl ist --> if(is_numeric($array[$counter -1]))
    4. ist das nicht der Fall, ersetze ich --> $array[$counter] = "-".$array[$counter+1]
    5. ich rücke alle nachkommenden werte jeweils eine stelle vor und lösche dann den letzten Wert mit pop()

    das sind 2 for() schleifen und eine if()
    danke für eure Hilfe,
    ich hab jetzt alles Fertig :)
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!