2013-06-19 16 views
7

Ich weiß, dass Strings in PHP sind ..... Strings aber zum Beispiel kann ichStrings als Arrays in php

$str = 'String'; 
echo $str[0]; 
echo $str[1]; 

//result 
S 
t 

echo count($str) 
//result 
1 

Warum ich sie Trog wie in einem Array laufen kann, kann sie aber nicht zählen mit zählen? (Ich weiß, dass ich strlen())

+1

Weil die Indizierung in eine Zeichenkette mit '[]' syntaktischer Zucker ist. Zeichenfolgen sind keine Arrays in PHP. – Tomalak

Antwort

20

verwenden kann, weil es so funktioniert. Sie können Zugriff auf bestimmte Byte-Offsets mit Bracket-Notation. Das bedeutet jedoch nicht, dass die Zeichenfolge ein Array ist und dass Sie Funktionen verwenden können, die darauf Arrays erwarten. $string[int] ist syntaktischer Zucker für substr($string, int, 1), nicht mehr und nicht weniger.

+0

Ich würde sie eher als * Offsets * bezeichnen, aber Sie haben recht mit dem Zucker. – GolezTrol

+2

LOL, gut getimte Kommentar. Nun, sie sind * nicht * Charakterversätze! Versuchen Sie: '$ s = '漢字'; $ s [1]; ' – deceze

+0

LOL, in der Tat ein gutes Timing. Anstelle von 'characters' hätte ich' code points' verwendet, aber 'bytes' scheint sich zu sehr auf die zugrundeliegende Struktur zu beziehen und geht davon aus, dass PHP nicht UTF16 oder irgendein anderer Multi-Byte-Zeichensatz ist und niemals sein wird. Ich muss zugeben, dass ich mir nicht sicher bin, und ich kann nicht finden, was die Ärzte darüber zu sagen haben. – GolezTrol

6

Da Zeichenfolgen keine Arrays sind. Sie ermöglichen Ihnen, Buchstaben mit der gleichen Syntax für Ihre Bequemlichkeit zu finden, aber das ist es auch schon.

Arrays können auch Schlüssel haben und können sortiert werden. Wenn Zeichenfolgen vollständige Arrays wären, könnten Sie jedem Buchstaben einen Schlüssel geben oder die Buchstaben mit einer der Array-Funktionen alphabetisch sortieren.

Lange Rede, kurzer Sinn: Ein String ist kein Array, auch wenn ein winziger Teil der Syntax ähnlich ist.

+1

Ich halte es für wichtig, zwischen "Buchstaben" und * Byte-Offsets * zu unterscheiden. :) – deceze