PHP Vor- und Rechenzeichen (-)
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
annahme
annehmen
array
art
aufgabenstellung
ausdruck
buffer
code
ersetzen
gestellte aufgabe
halbwissen
idee
last
pop
rechnung
string
vorzeichen
zahl
zeichenkette
zerlegen
-
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 :) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Die -- durch + ersetzen ist eine gute Idee,
evtl. verwende mehrdimensionale Arrays. -
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 -
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 :) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage