Mailinglisten-Archive |
Hi Peter, On Saturday 05 June 2004 18:59, Peter Bieling wrote: > es geht mir nicht um diese "\0"-Geschichte, sondern darum, dass ein Doch ;-) <?php $string = "foo"; $len = strlen($string); echo $string.":\n"; for ($i = 0; $i<$len; $i++) { printf("%u => %u\n", $i, ord($string{$i})); } $string{1} = ''; echo $string.":\n"; for ($i = 0; $i<$len; $i++) { printf("%u => %u\n", $i, ord($string{$i})); } ?> foo: 0 => 102 1 => 111 2 => 111 fo: 0 => 102 1 => 0 2 => 111 Durch die _Zuweisung_ von nichts ('') auf $string{1} wird da das entsprechende Zeichen nicht gelöscht sondern durch nichts ersetzt. Nichts wird dabei durch NULL, also das Zeichen mit Ascii-Wert 0 repräsentiert. Nur weil ich mich gerade nicht zurück halten konnte mal wieder den C-Compiler nazuwerfen: Wie verhalten sich "ordentliche" Programmiersprachen wie z.B. C? #include <stdio.h> int main() { int i; char string[] = "foo"; int len = strlen(string); printf("%s:\n", string); for (i=0; i<=len; i++) { printf("%u => %u\n", i, string[i]); } string[1] = ""; printf("%s:\n", string); for (i=0; i<=len; i++) { printf("%u => %u\n", i, string[i]); } } Da gibt der gcc gleich mal eine Warnung aus: test.c:14: warning: assignment makes integer from pointer without a cast Korrekt wäre die Zuweisung string[1] = '\0'; ich wollte es aber möglichst analog zum PHP-Script haben... Und einen weiteren unterschied habe ich aber noch drin und zwar geht die anzeigende for-Schleife von 0 bis $i<$len wohingegen bei der C-Version die Schleife von 0 bis i<=len geht, ganz einfach weil Strings in C Null-terminiert sind und das \0 am Ende noch dazugehört, strlen das aber als Ende interpretiert. Bei PHP hört er wirklich "am Ende" auf. foo: 0 => 102 1 => 111 2 => 111 3 => 0 fo: 0 => 102 1 => 4294967191 // Bei string[1] = '\0'; stünde hier 0 2 => 111 3 => 0 Ergebnis: Auch bei "ordentlichen" Programmiersprachen kann man nicht einfach ein Zeichen mit "nichts" überschreiben und somit Teile aus dem String kürzen. Wenn ich _ein_ Zeichen bearbeite will ich, dass auch nur _ein_ Zeichen beabeitet wird. Wenn ich "Wechselwirkungen" mit anderen Zeichen zulassen will nutze ich substr oder ähnliches, die darauf Rücksicht nehemen. <?php $string = 'foo'; $string{1} = 'bar'; echo $string; ?> Gibt ja auch "fbo" und nicht "fbar" aus. johannes
php::bar PHP Wiki - Listenarchive