Intereting Posts
CakePHP 3 – Как использовать Trim () перед проверкой NotEmpty? Развертывание с использованием ssh с ключом без предоставления парольной фразы для закрытого ключа (ssh-agent) Почему встроенные функции в PHP называются так случайным образом? Дополнительные changeColumns в Doctrine generate-migrations-diff Сделать файл XAMPP / Apache за пределами htdocs Как изменить второй раскрывающийся список на основе раскрывающегося списка? Получить данные из первого td в каждом tr file_get_contents не работает на порту 8282 Изменение таблицы MySQL на разных страницах с оценками из HTML-формы как интегрировать логин facebook с вашим сайтом? Каков наилучший способ обработки рекурсии в smarty? Неустранимая ошибка: вызов неопределенной функции finfo_open () в php Проверка Laravel, если существует соответствующая модель Lumen FatalErrorException в строке RedirectResponse.php 75: вызов функции-члена flashInput () на null Тестирование всего PHP-сайта

Получение первого символа строки с $ str

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

Или я должен просто придерживаться хорошего ol ' substr($str, 0, 1) ?

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

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

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

Синтаксис {} устаревает с PHP 6. Рекомендуется использовать квадратные скобки.

Допустим, вам просто нужен первый символ из части $ _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] , но это зависит от окружающих обстоятельств.

Мое единственное сомнение было бы в том, насколько применимо этот метод будет в многобайтовых строках, но если это не соображение, то я подозреваю, что вы охвачены. (Если есть сомнения, 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 …

 $str = 'abcdef'; echo $str[0]; // a 

В случае многобайтовых (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}; 

Это оно!