Ich möchte den ersten Buchstaben einer Zeichenfolge erhalten und habe festgestellt, dass dies $str[0]
hervorragend funktioniert. Ich bin mir nur nicht sicher, ob dies eine "gute Praxis" ist, da diese Notation im Allgemeinen bei Arrays verwendet wird. Diese Funktion scheint nicht sehr gut dokumentiert zu sein, also wende ich mich an euch, um mir zu sagen, ob es in jeder Hinsicht in Ordnung ist, diese Notation zu verwenden.
Oder sollte ich mich einfach an den guten Alten halten substr($str, 0, 1)
?
Außerdem habe ich festgestellt, dass geschweifte Klammern ( $str{0}
) ebenfalls funktionieren. Was ist damit?
Antworten:
Ja. Zeichenfolgen können als Zeichenarrays angesehen werden. Der Zugriff auf eine Position eines Arrays erfolgt über den
[]
Operator. Normalerweise gibt es überhaupt kein Problem bei der Verwendung$str[0]
(und ich bin mir ziemlich sicher, dass es viel schneller als diesubstr()
Methode ist).Bei beiden Methoden gibt es nur eine Einschränkung: Sie erhalten das erste Byte und nicht das erste Zeichen . Dies ist wichtig, wenn Sie Multibyte-Codierungen verwenden (z. B. UTF-8). Wenn Sie dies unterstützen möchten, verwenden Sie
mb_substr()
. Wahrscheinlich sollten Sie heutzutage immer von einer Multibyte-Eingabe ausgehen, daher ist dies die beste Option, aber sie wird etwas langsamer sein.quelle
mb_substr($str, 0, 1, 'utf-8')
Sie dies tun, damit Sie keine Multibyte-Zeichenfolge abschneiden.substr($str, 0, 1)
, verwirrt dies, wer den Code liest.Die Syntax {} ist ab PHP 5.3.0 veraltet. Eckige Klammern werden empfohlen.
quelle
Note: Strings may also be accessed using braces, as in $str{42}, for the same purpose. However, this syntax is deprecated as of PHP 5.3.0. Use square brackets instead, such as $str[42].
Note: Strings may also be accessed using braces, as in $str{42}, for the same purpose.
Ich frage mich also, ob sie entschieden haben, dass die Verwendung ab{}
PHP 6 NICHT mehr veraltet istThe curly-brackets-string-index-accessor-syntax does not emit any deprecation notice, although the original notice have been on and off for PHP 5.x, it does not in the current version, thrus we should not label it as deprecated. Related to bug #52254
- svn.php.net/repository/phpdoc/en/trunk/language/types/…Note: Strings may also be accessed using braces, as in $str{42}, for the same purpose.
Diese Syntax scheint noch eine Weile zu bleiben.Nehmen wir an, Sie möchten nur das erste Zeichen aus einem Teil von $ _POST, nennen wir es 'Typ'. Und dieses $ _POST ['Typ'] ist derzeit 'Kontrolle'. Wenn in diesem Fall, wenn Sie verwenden
$_POST['type'][0]
, odersubstr($_POST['type'], 0, 1)
Sie werdenC
zurückkommen.Wenn die Clientseite jedoch die Daten ändert, die sie Ihnen beispielsweise von
type
bistype[]
sendet, und dann 'Control' und 'Test' als Daten für dieses Array sendet,$_POST['type'][0]
wird dies jetzt zurückgegebenControl
und nicht einfach,C
während diessubstr($_POST['type'], 0, 1)
einfach fehlschlägt.Ja, es kann ein Problem bei der Verwendung geben
$str[0]
, aber das hängt von den Umgebungsbedingungen ab.quelle
if (true === is_string($_POST['type']))
Mein einziger Zweifel wäre, wie anwendbar diese Technik auf Multi-Byte-Strings wäre, aber wenn dies keine Überlegung ist, dann vermute ich, dass Sie abgedeckt sind. (Im Zweifelsfall
mb_substr()
scheint dies eine offensichtlich sichere Wahl zu sein.)Aus einer Gesamtperspektive muss ich mich jedoch fragen, wie oft Sie auf das 'n'-te Zeichen in einer Zeichenfolge zugreifen müssen, damit dies eine wichtige Überlegung ist.
quelle
Es hängt von den Ressourcen ab, aber Sie können das folgende Skript ausführen und sich selbst davon überzeugen;)
Einige Referenznummern (auf einem alten CoreDuo-Computer)
Es scheint , dass die Verwendung
[]
oder{}
Betreiber mehr oder weniger das gleiche ist .quelle
testA
undtestB
innerhalb derselben Schleifen nicht mischen , können Sie beispielsweise die Tatsache erkennen, dasstestB
es sich um einen Cache-Killer handelt, während SietestA
Cache-freundlich sind. Wenn sie sich beide in derselben Schleife befinden, wird gemessen, dass sie aufgrund des Caching dertestB
verschmutzten Zeit die gleichen Timings habentestA
.microtime()
Anruf benötigt wird, den größten Teil des Zeitunterschieds ausmachen würde, obwohl dies experimentell scheint um nicht wahr zu sein), gibt es hier keinen Grund, sich um den winzigen Geschwindigkeitsunterschied zu kümmern. Es ist ein Bruchteil einer Millionstel Sekunde; Wann wird das jemals eine Rolle spielen?Wenn ich nur als Sterblicher spreche, bleibe ich dabei
$str[0]
. Für mich ist es schneller, die Bedeutung von$str[0]
auf einen Blick zu erfassen alssubstr($str, 0, 1)
. Dies läuft wahrscheinlich auf eine Frage der Präferenz hinaus.Was die Leistung angeht, Profilprofil Profil. :) Oder Sie könnten in den PHP-Quellcode schauen ...
quelle
quelle
Bei Multibyte-Zeichenfolgen (Unicode-Zeichenfolgen)
str[0]
kann die Verwendung Probleme verursachen.mb_substr()
ist eine bessere Lösung. Zum Beispiel:Einige Details hier: Holen Sie sich das erste Zeichen der UTF-8-Zeichenfolge
quelle
Ich habe diese Notation auch schon einmal verwendet, ohne schlechte Nebenwirkungen und ohne Missverständnisse. Es macht Sinn - eine Zeichenfolge besteht schließlich nur aus einer Reihe von Zeichen.
quelle
$str[42]
. Stellen Sie sich eine Zeichenfolge als eine Reihe von Zeichen für diesen Zweck vor. Intern sind PHP-Strings Byte-Arrays.$arr[] = $new_element
) funktioniert nicht bei Zeichenfolgen. Daher halte ich es nicht für sinnvoll, Strings als Zeichenarrays zu verstehen.