web-dev-qa-db-fra.com

Obtenir le premier caractère d'une chaîne avec $ str [0]

Je veux obtenir la première lettre d'une chaîne et j'ai remarqué que $str[0] fonctionne très bien. Je ne suis 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 très bien documentée, alors je me tourne vers vous pour me dire si tout va bien - à tous les égards - pour utiliser cette notation?

Ou devrais-je simplement m'en tenir au bon vieux substr($str, 0, 1)?

De plus, j'ai remarqué que les accolades ($str{0}) fonctionnaient également. Quoi de neuf avec ça?

259
Tatu Ulmanen

Oui. Les chaînes peuvent être considérées comme des tableaux de caractères. Pour accéder à une position d'un tableau, vous devez utiliser l'opérateur []. Habituellement, il n’ya aucun problème à utiliser $str[0] (et je suis presque sûr que c’est beaucoup plus rapide que la méthode substr().).

Les deux méthodes ne comportent qu'un seul inconvénient: elles obtiendront le premier octet, plutôt que le premier caractère. Ceci est important si vous utilisez des codages sur plusieurs octets (tels que UTF-8). Si vous voulez supporter cela, utilisez mb_substr(). On peut soutenir que vous devez toujours supposer une entrée multi-octets ces jours-ci, donc c'est l'option la meilleure, mais ce sera un peu plus lent.

369
Hock

La syntaxe {} est obsolète à partir de PHP 5.3.0. Les crochets sont recommandés.

44
Michael Morton

Disons que vous voulez juste le premier caractère d'une partie de $ _POST, appelons-le 'type'. Et ce $ _POST ['type'] est actuellement 'Control'. Si dans ce cas, si vous utilisez $_POST['type'][0] ou substr($_POST['type'], 0, 1), vous obtiendrez C en retour.

Cependant, si le côté client devait modifier les données qu'il vous envoyait, par exemple de type à type[], puis envoyer 'Control' et 'Test' comme données pour ce tableau, $_POST['type'][0] retournera maintenant Control plutôt que C alors que substr($_POST['type'], 0, 1) échouera simplement.

Donc, oui, l'utilisation de $str[0] peut poser problème, mais cela dépend des circonstances.

22
gattsbr

Mon seul doute serait de savoir si cette technique serait applicable aux chaînes multi-octets, mais si ce n'est pas une considération, je suppose que vous êtes couvert. (En cas de doute, mb_substr() semble être un choix sûr.)

Cependant, d'une perspective globale, je dois me demander combien de fois vous devez accéder au caractère 'nth d'une chaîne pour que cela soit une considération clé.

12
John Parker

Cela varie en fonction des ressources, mais vous pouvez exécuter le script ci-dessous et voir par vous-même;)

<?php
$tests = 100000;

for ($i = 0; $i < $tests; $i++)
{
    $string = md5(Rand());
    $position = Rand(0, 31);

    $start1 = microtime(true);
    $char1 = $string[$position];
    $end1 = microtime(true);
    $time1[$i] = $end1 - $start1;

    $start2 = microtime(true);
    $char2 = substr($string, $position, 1);
    $end2 = microtime(true);
    $time2[$i] = $end2 - $start2;

    $start3 = microtime(true);
    $char3 = $string{$position};
    $end3 = microtime(true);
    $time3[$i] = $end3 - $start3;
}

$avg1 = array_sum($time1) / $tests;
echo 'the average float microtime using "array[]" is '. $avg1 . PHP_EOL;

$avg2 = array_sum($time2) / $tests;
echo 'the average float microtime using "substr()" is '. $avg2 . PHP_EOL;

$avg3 = array_sum($time3) / $tests;
echo 'the average float microtime using "array{}" is '. $avg3 . PHP_EOL;
?>

Quelques références (sur une ancienne machine CoreDuo)

$ php 1.php 
the average float microtime using "array[]" is 1.914701461792E-6
the average float microtime using "substr()" is 2.2536706924438E-6
the average float microtime using "array{}" is 1.821768283844E-6

$ php 1.php 
the average float microtime using "array[]" is 1.7251944541931E-6
the average float microtime using "substr()" is 2.0931363105774E-6
the average float microtime using "array{}" is 1.7225742340088E-6

$ php 1.php 
the average float microtime using "array[]" is 1.7293763160706E-6
the average float microtime using "substr()" is 2.1037721633911E-6
the average float microtime using "array{}" is 1.7249774932861E-6

Il semble que l’utilisation des opérateurs [] ou {} soit plus ou moins identique.

9
Willy Stadnick

Parlant comme un simple mortel, je resterais avec $str[0]. En ce qui me concerne, il est plus rapide de comprendre la signification de $str[0] en un coup d'œil que substr($str, 0, 1). Cela revient probablement à une question de préférence.

En ce qui concerne les performances, eh bien, profil profil profil. :) Ou vous pouvez regarder dans le code source PHP ...

6
Stephen
$str = 'abcdef';
echo $str[0];                 // a
5
Jakir Hossain

Dans le cas de chaînes multi-octets (unicode) utilisant str[0], cela peut poser problème. mb_substr() est une meilleure solution. Par exemple:

$first_char = mb_substr($title, 0, 1);

Quelques détails ici: Obtenez le premier caractère de la chaîne UTF-8

2
Sergey Burish

J'ai déjà utilisé cette notation auparavant, sans effets secondaires néfastes et sans malentendus. Cela a du sens - une chaîne est simplement un tableau de caractères, après tout.

1
Kaleb Brasee