Entwickler-Ecke
Programmiersprachen (Server) - [PHP] Unset löscht Array-Element nicht
Heiko - Fr 11.05.07 16:21
Titel: [PHP] Unset löscht Array-Element nicht
Hallo,
da ich mich mal wieder in php einüben wollte, mache ich momentan die Info-HAs alle mit php, anstatt mit Delphi.
Momentan geht es da um ein Simulation eines ASM-Modell.
Die Eingabe besteht aus mehreren Zeilen, wobei eine Zeile ein ASM-Code ist. Dem entsprechend sind die Parameter in der gleichen Zeile - und zwar durch Leerzeichen getrennt.
Das habe ich jetzt so weit in Arrays aufgetrennt.
Quelltext
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:
| <?php function ExplodeASMCode($asm){ //Zeilenumbruchsbehandlung $asm = str_replace(chr(13).chr(10), chr(13), $asm); $asm = str_replace(chr(10), chr(13), $asm); //String in Zeilenweises Array zerlegen $lines = explode(chr(13), $asm); //Zeilen bearbeiten for ($i = count($lines)-1; $i>-1; $i--){ //Kommentare entfernen $compos = strpos($lines[$i], '//'); if ($compos != 0) $lines[$i] = substr($lines[$i], 0, $compos); $lines[$i] = trim($lines[$i]); //übrige in Array einteilen if ($lines[$i] != ''){ $linepart[$i] = explode(' ', $lines[$i]); //alle Leerstellen entfernen reset($linepart[$i]); foreach ($linepart[$i] as $key => $val){ if ($val === ''){ unset($linepart[$key]); } } } } var_dump($linepart); return 0; } ?> |
Allerdings hat der Code Probleme mit mehreren Leerzeichen. Also wenn z.B. zwischen dem ASM-Befehl und dem Arbeitsregister 2 Leerzeichen fürgt explode noch ein Leerstring ein. Diese wollte ich nun entfernen. Aber unset funktioniert dort nicht. Weiß einer von euch wieso?
PS: Falls einer eine bessere Variante für die Zeilenumbrüche hat, wäre ich dankbar.
Grüße
Heiko
//EDIT: Als ich mir hier den Quelli nachm abschicken noch einmal anguckte, viel mehr der Fehler auf... . Statt unset($linepart[$key]); muss es unset($linepart[$i][$key]); sein
Christian S. - Fr 11.05.07 16:38
Du könntest statt
explode auch
preg_split verwenden:
Quelltext
1:
| $linepart[$i] = preg_split("/[ ]+/", $lines[$i]); |
blackbirdXXX - Fr 11.05.07 16:56
Titel: Re: [PHP] Unset löscht Array-Element nicht
Heiko hat folgendes geschrieben: |
PS: Falls einer eine bessere Variante für die Zeilenumbrüche hat, wäre ich dankbar. |
Wenn deine Newline Zeichen bereits auf \n normalisiert sind ist die schnellste Variante
explode("\n", $s);. Ansonsten mach
preg_split('/(?:\\r\\n|\\r|\\n)/', $s). Das akzeptiert dann Mac OS, UNIX und DOS Zeilenumbrüche.
Heiko - Fr 11.05.07 18:10
Könnt ihr mir nur einmal kurz sagen, wie die / etc. zu interpretieren sind? Suchmasken liegen bei mir schon über ein JAhr zurück... .
Christian S. - Fr 11.05.07 18:15
Das erste Zeichen eines regulären Ausdrucks gibt an, mit welchem Zeichen er beendet wird. In diesem Fall ist also alles zwischen den beiden "/" der reguläre Ausdruck. Nach dem letzten "/" können dann noch Modifier stehen, wie z.B. "i", falls das Ganze case-insensitiv sein soll.
Heiko - Sa 12.05.07 21:06
Hallo Danke an euch beiden :).
So gefällt mir es schon besser:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| <?php function ExplodeASMCode($asm){ $asm = str_replace(chr(10), chr(13), $asm); //String in Zeilenweises Array zerlegen $lines = preg_split('/\r\n|\r|\n/', $asm); //Zeilen bearbeiten for ($i = count($lines)-1; $i>-1; $i--){ //Kommentare entfernen $compos = strpos($lines[$i], '//'); if ($compos != 0) $lines[$i] = substr($lines[$i], 0, $compos); $lines[$i] = trim($lines[$i]); //übrige in Array einteilen if ($lines[$i] != '') $linepart[] = preg_split("/[ ]+/", $lines[$i]); } var_dump($linepart); return 0; } ?> |
@Blackbird: Welche Vrtoeile bringt die "Aufblähung" von
preg_split('/(?:\\r\\n|\\r|\\n)/', $s), denn
preg_split('/\r\n|\r|\n/', $asm) scheint das gleiche zu machen...
blackbirdXXX - Sa 12.05.07 22:27
Heiko hat folgendes geschrieben: |
@Blackbird: Welche Vrtoeile bringt die "Aufblähung" von preg_split('/(?:\\r\\n|\\r|\\n)/', $s), denn preg_split('/\r\n|\r|\n/', $asm) scheint das gleiche zu machen... |
Tut es auch. Frag mich nicht warum ich jetzt eine anonyme Gruppe verwendet hab :D
Heiko - Di 15.05.07 10:39
Hallo,
ich musste gerade feststellen, dass das mit preg_match doch nicht so funktioniert, wie es sollte. Sprich er hat Probleme mit dem Win-Zeilenumbruch. Wenn ein solcher kommt, trennt er zwar an der Stelle, macht jedoch eine Leerzeile dazu. Wenn ich "|\r|\n" entferne, also so, dass nur noch "\r\n" übrig bleibt, zerlegt er es gar nicht mehr :(. weiß einer von euch, woran es vlt. liegen könnt (@blackbird: bei deiner Variante passiert das gleiche ;) )?
//EDIT: Fehler gefunden. Lag am str_replace was ich ausversehen drin gelassen hatte.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!