Получение первого символа строки с $str[0]
Я хочу получить первую букву строки, и я заметил, что $str[0] работает отлично. Я просто не уверен, что это "хорошая практика", так как эта нотация обычно используется с массивами. Эта функция, похоже, не очень хорошо документирована, поэтому я обращаюсь к вам, ребята, чтобы сказать мне, все ли в порядке – во всех отношениях – использовать эту нотацию?
или я должен просто придерживаться хорошего ol' substr($str, 0, 1)?
кроме того, я отметил, что фигурные скобки ($str{0}) работает хорошо. Что - ну и что?
12 ответов:
да. Строки можно рассматривать как символьные массивы, и способ доступа к позиции массива заключается в использовании
[]оператора. Обычно нет никаких проблем в использовании$str[0](и я уверен, что намного быстрее, чемsubstr()метод).есть только один нюанс с обоими методами: они получат первый байт, а не "первый"!--7-->символ. Это важно, если вы используете многобайтовые кодировки (например, UTF-8). Если вы хотите поддержать это, используйте
mb_substr(). Возможно, вы всегда должны предполагать многобайтовый ввод в эти дни, так что это лучшие, но это будет немного медленнее.
синтаксис {} является устаревшей начиная с версии PHP 5.3.0. Рекомендуется использовать квадратные скобки.
допустим, вы просто хотите первый символ из части $_POST, давайте назовем его "тип". И что $_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], но это зависит от окружающих обстоятельств.
Я сомневаюсь только в том, насколько применим этот метод к многобайтовым строкам, но если это не рассматривается, то я подозреваю, что вы охвачены. (Если вы сомневаетесь,
mb_substr()кажется, очевидно безопасный выбор.)однако, с точки зрения большой картины, я должен задаться вопросом, как часто вам нужно обращаться к 'n' - му символу в строке, чтобы это было ключевым соображением.
это будет варьироваться в зависимости от ресурсов, но вы можете запустить скрипт ниже и посмотреть сами;)
<?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кажется, что с помощью
[]или{}операторы более или менее одинаковы.
говоря как простой смертный, я бы придерживался
$str[0]. Насколько я понимаю, это быстрее понять значение$str[0]с первого взгляда, чемsubstr($str, 0, 1). Это, вероятно, сводится к вопросу о предпочтениях.насколько производительность идет, ну, профиль профиля профиля. :) Или вы можете заглянуть в исходный код PHP...
Я использовал эту нотацию и раньше, без каких-либо побочных эффектов и недоразумений. Это имеет смысл-строка-это просто массив символов, в конце концов.
в случае многобайтовых (unicode) строк с использованием
str[0]может вызвать проблемы.mb_substr()- это лучшее решение. Например:$first_char = mb_substr($title, 0, 1);вот некоторые детали: получить первый символ строки UTF-8
рассмотрим следующее:
<?php var_dump($_POST); // Post var is a string: echo '1'; var_dump( strtoupper( $_POST['flag1'][0] ) === 'T' ); // boolean true echo '2'; var_dump( strtoupper( substr( $_POST['flag1'],0,1 ) ) === 'T' ); // boolean true // Post var is an array of strings echo '5'; var_dump( strtoupper( $_POST['flag2'][0] ) === 'T' ); // boolean false echo '6'; var_dump( strtoupper( substr( $_POST['flag2'],0,1 ) ) === 'T' ); // generates a PHP warning ?> <hr /> <form method="POST"> <input type="text" name="name" value="bob" /><br /> <input type="text" name="flag1" value="true" /><br /> <select name="flag2[]" multiple> <option value="true" selected>true</option> <option value="false" selected>false</option> <option value="0" selected>0</option> </select><br /> <input type="submit" value="Submit" /><br /> </form>намерение состоит в том, чтобы обнаружить логический флаг. Хотя можно запутать проблему, превратив var в тип массива, использование нотации массива-индекса дает безопасный ложный результат, тогда как функция substr() создает ошибку. Учитывая выбор здесь, я бы пошел с подстрочной нотацией.
вот как я решил проблему:
<?php $string = 'Hello The World'; $stringExp = explode(' ', $string); $shortCode = ''; for($i = 0; $i < count($stringExp); $i++): $shortCode .= substr($stringExp[$i], 0, 1); endfor; echo $shortCode; // result : HTW ?>
легко получить первый символ строки. Просто рассматривайте строку как массив.
пример:
$first = $string{0}; $fifth = $string{5};вот именно!
Comments