it-roy-ru.com

Получение первого символа строки с помощью $ str [0]

Я хочу получить первую букву строки, и я заметил, что $str[0] прекрасно работает. Я просто не уверен, является ли это "хорошей практикой", так как эта запись обычно используется с массивами. Эта функция, похоже, не очень хорошо задокументирована, поэтому я обращаюсь к вам, ребята, чтобы сказать мне, все ли в порядке - во всех отношениях - использовать эту запись?

Или я должен просто придерживаться доброй substr($str, 0, 1)?

Также я отметил, что фигурные скобки ($str{0}) также работают. Что с этим?

256
Tatu Ulmanen

Да. Строки можно рассматривать как символьные массивы, и способ доступа к позиции массива заключается в использовании оператора []. Обычно нет никаких проблем с использованием $str[0] (и я уверен, что он намного быстрее, чем метод substr()).

Существует только одно предупреждение с обоими методами: они получат первый байт, а не первый символ. Это важно, если вы используете многобайтовые кодировки (такие как UTF-8). Если вы хотите поддержать это, используйте mb_substr(). Возможно, вы должны всегда предполагать многобайтовый ввод в эти дни, так что это опция best, но она будет немного медленнее.

366
Hock

Синтаксис {} устарел с PHP 5.3.0. Квадратные скобки рекомендуются.

44
Michael Morton

Допустим, вам нужен только первый символ из части $ _POST, давайте назовем его 'type'. И этот $ _POST ['type'] в настоящее время 'Control'. Если в этом случае вы используете $_POST['type'][0] или substr($_POST['type'], 0, 1), вы получите C обратно.

Однако, если клиентская сторона будет изменять данные, которые они вам отправляют, например, от type до type[], а затем отправлять "Control" и "Test" в качестве данных для этого массива, $_POST['type'][0] теперь будет возвращать Control вместо C, тогда как substr($_POST['type'], 0, 1) будет просто не получится.

Так что да, может быть проблема с использованием $str[0], но это зависит от окружающих обстоятельств.

22
gattsbr

Единственное, в чем я сомневаюсь, это то, насколько применим этот метод к многобайтовым строкам, но если это не так, то я подозреваю, что вы защищены. (Если сомневаетесь, mb_substr() кажется очевидным безопасным выбором.)

Однако, с точки зрения общей картины, я должен задаться вопросом, как часто вам нужен доступ к n-му символу в строке, чтобы это было ключевым фактором.

12
John Parker

Это будет зависеть от ресурсов, но вы можете запустить скрипт ниже и убедиться сами;)

<?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;
?>

Некоторые ссылочные номера (на старой машине с 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

Кажется, что использование операторов [] или {} более или менее одинаково.

9
Willy Stadnick

Говоря как простой смертный, я бы придерживался $str[0]. Что касается меня, то быстрее понять значение $str[0] с первого взгляда, чем substr($str, 0, 1). Это, вероятно, сводится к вопросу предпочтений.

Что касается производительности, ну, профиль профиль профиль. :) Или вы можете заглянуть в исходный код PHP ...

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

В случае многобайтовых (юникодных) строк использование str[0] может вызвать проблемы. mb_substr() - лучшее решение. Например:

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

Некоторые детали здесь: Получить первый символ строки UTF-8

2
Sergey Burish

Я использовал эту запись и раньше, без каких-либо побочных эффектов и недопонимания. Это имеет смысл - в конце концов, строка - это просто массив символов.

1
Kaleb Brasee