Je veux obtenir la première lettre d'une chaîne et j'ai remarqué que cela $str[0]
fonctionne très bien. Je ne suis tout simplement pas sûr que ce soit une «bonne pratique», car cette notation est généralement utilisée avec les tableaux. Cette fonctionnalité ne semble pas être très bien documentée, donc je me tourne vers vous pour me dire si c'est correct - à tous égards - d'utiliser cette notation?
Ou devrais-je simplement m'en tenir au bon vieux substr($str, 0, 1)
?
J'ai également noté que les accolades ( $str{0}
) fonctionnent également. Qu'est-ce qui se passe avec ça?
Réponses:
Oui. Les chaînes peuvent être vues comme des tableaux de caractères, et la façon d'accéder à la position d'un tableau est d'utiliser l'
[]
opérateur. Habituellement, il n'y a aucun problème à utiliser$str[0]
(et je suis sûr que c'est beaucoup plus rapide que lasubstr()
méthode).Il n'y a qu'une mise en garde avec les deux méthodes: elles obtiendront le premier octet , plutôt que le premier caractère . Ceci est important si vous utilisez des encodages multi-octets (tels que UTF-8). Si vous souhaitez soutenir cela, utilisez
mb_substr()
. On peut dire que vous devriez toujours supposer une entrée multi-octets de nos jours, c'est donc la meilleure option, mais ce sera légèrement plus lent.la source
mb_substr($str, 0, 1, 'utf-8')
pour ne pas tronquer une chaîne multi-octets.substr($str, 0, 1)
cela, cela confond celui qui lit le code.La syntaxe {} est obsolète à partir de PHP 5.3.0. Les crochets sont recommandés.
la source
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.
Je me demande donc s'ils ont décidé que l'utilisation{}
n'est plus obsolète à partir de PHP 6The 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.
On dirait que cette syntaxe va rester pendant un certain temps.Disons que vous voulez juste le premier caractère d'une partie de $ _POST, appelons-le 'type'. Et que $ _POST ['type'] est actuellement 'Control'. Si dans ce cas si vous utilisez
$_POST['type'][0]
, ousubstr($_POST['type'], 0, 1)
vousC
reviendrez.Cependant, si le client devait modifier les données qu'il vous envoie, depuis
type
àtype[]
par exemple, puis envoyer «Control» et «Test» en tant que données pour ce tableau,$_POST['type'][0]
retournera maintenantControl
plutôtC
quesubstr($_POST['type'], 0, 1)
qu'il échouera simplement.Alors oui, il peut y avoir un problème avec l'utilisation
$str[0]
, mais cela dépend des circonstances environnantes.la source
if (true === is_string($_POST['type']))
Mon seul doute serait de savoir comment cette technique serait applicable sur des chaînes multi-octets, mais si ce n'est pas un facteur, je suppose que vous êtes couvert. (En cas de doute,
mb_substr()
semble un choix évidemment sûr.)Cependant, d'un point de vue d'ensemble, je dois me demander à quelle fréquence vous devez accéder au caractère n 'dans une chaîne pour que cela soit une considération clé.
la source
Cela variera en fonction des ressources, mais vous pouvez exécuter le script ci-dessous et voir par vous-même;)
Quelques références (sur une ancienne machine CoreDuo)
Il semble que l'utilisation des opérateurs
[]
ou{}
soit plus ou moins la même chose.la source
testA
ettestB
au sein des mêmes boucles signifie que vous êtes capable de détecter, par exemple, le fait que letestB
cache-tueurtestA
est compatible avec le cache. Quand ils sont tous les deux dans la même boucle, ils sont mesurés pour avoir les mêmes timings parce que la mise en cache detestB
polluétestA
.microtime()
appel compenserait la majeure partie du décalage horaire, bien que cela semble expérimentalement pour ne pas être vrai), il n'y a aucune raison de se soucier de la petite différence de vitesse ici. C'est une fraction d'un millionième de seconde; quand est-ce que ça va être important?Parlant comme un simple mortel, je resterais avec
$str[0]
. En ce qui me concerne, il est plus rapide de saisir le sens d'$str[0]
un coup d'œil quesubstr($str, 0, 1)
. Cela se résume probablement à une question de préférence.En ce qui concerne les performances, eh bien, profil profil profil. :) Ou vous pouvez regarder le code source PHP ...
la source
la source
Dans le cas de chaînes multi-octets (unicode), l'utilisation
str[0]
peut provoquer un problème.mb_substr()
est une meilleure solution. Par exemple:Quelques détails ici: Obtenez le premier caractère de la chaîne UTF-8
la source
J'ai également utilisé cette notation auparavant, sans aucun effet secondaire et aucun malentendu. Cela a du sens - une chaîne n'est qu'un tableau de caractères, après tout.
la source
$str[42]
. Considérez une chaîne comme un tableau de caractères à cet effet. En interne, les chaînes PHP sont des tableaux d'octets.$arr[] = $new_element
) d' ajout de tableau ne fonctionne pas sur les chaînes. En tant que tel, je ne pense pas que la conception de chaînes comme des tableaux de caractères soit utile.