Недавно я вижу, что премьер-министр Сингапура опубликовал программу, которую он написал на facebook, есть одна строка, чтобы упомянуть ее.
Логика - это просто «значение & amp; -значение», предположим, что у вас есть 0x0FF0, затем 0FF0 & amp; (F00F + 1), что равно 0x0010, что означает, что самый низкий 1 находится в 4-м бите ..:)
[]
. Обычно нет никакой проблемы при использовании $ str [0]
(и я уверен, что это намного быстрее, чем метод substr ()
). Существует только одна оговорка с обоими методами: они получат первый байт , а не первый символ . Это важно, если вы используете многобайтовые кодировки (например, UTF-8). Если вы хотите поддержать это, используйте mb_substr ()
. Возможно, вы всегда должны принимать многобайтовый вход в эти дни, так что это best , но он будет немного медленнее.
Синтаксис {} устарел с PHP 5.3.0. Рекомендуется использовать квадратные скобки.
Примечание. Строки также могут быть доступны с помощью фигурных скобок, как в $ str {42}, с той же целью. Однако этот синтаксис устарел с PHP 5.3.0. Вместо этого используйте квадратные скобки, например $ str [42].
– VolkerK
29 December 2009 в 01:24
Примечание. Строки также могут быть доступны с помощью фигурных скобок, как в $ str {42}, с той же целью.
Так что мне интересно, решили ли они, что использование {}
больше не устарело с PHP 6
– Marco Demaio
21 February 2012 в 20:58
Синтаксис curly-brackets-string-index-accessor-синтаксиса не выделяет уведомления об исключении, хотя исходное уведомление было включено и выключено для PHP 5.x, это не в текущей версии, т. е. мы не должны указывать ее как устаревшую. Связано с ошибкой # 52254
- svn.php.net/repository/phpdoc/en/trunk/language/types/…
– VolkerK
15 March 2017 в 13:40
Примечание. Строки также могут быть доступны с помощью фигурных скобок, например, в $ str {42}, с той же целью ,
Кажется, этот синтаксис будет оставаться на некоторое время.
– Fr0zenFyr
10 May 2018 в 09:43
Вот как я решил проблему:
& lt;? php $ string = 'Hello The World'; $ stringExp = explode ('', $ string); $ shortCode = ''; for ($ i = 0; $ i & lt; count ($ stringExp); $ i ++): $ shortCode. = substr ($ stringExp [$ i], 0, 1); ENDFOR; echo $ shortCode; // результат: HTW? & gt;
Рассмотрим следующее:
& lt;? php var_dump ($ _ POST); // Post var - строка: 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 - это массив строк echo '5'; var_dump (strtoupper ($ _POST ['flag2'] [0]) === 'T'); // boolean false echo '6'; var_dump (strtoupper (substr ($ _POST ['flag2'], 0,1)) === 'T'); // генерирует предупреждение PHP? & gt; & lt; hr / & gt; & lt; form method = "POST" & gt; & lt; input type = "text" name = "name" value = "bob" / & gt; & lt; br / & gt; & lt; input type = "text" name = "flag1" value = "true" / & gt; & lt; br / & gt; & lt; select name = "flag2 []" multiple & gt; & lt; option value = "true" selected & gt; true & lt; / option & gt; & lt; option value = "false" selected & gt; false & lt; / option & gt; & lt; значение опции = "0" выбрано & gt; 0 & lt; / option & gt; & lt; / select & gt; & lt; br / & gt; & lt; input type = "submit" value = "Submit" / & gt; & lt; br / & gt; & Lt; / форма & GT;
Цель состоит в том, чтобы обнаружить булевский флаг. Хотя можно путать проблему, превратив var в тип массива, использование нотации с индексом массива создает безопасный ложный результат, тогда как функция substr () создает ошибку. Учитывая выбор здесь, я бы пошел с нотной записью.
В случае многобайтовых (unicode) строк с использованием str [0]
может вызвать проблемы. mb_substr ()
- лучшее решение. Например:
$ first_char = mb_substr ($ title, 0, 1);
Некоторые подробности здесь: Получить первый символ строки UTF-8
Допустим, вы просто хотите, чтобы первый символ из части $ _POST, назовем его «type». И этот $ _POST ['type'] в настоящее время является «Control». Если в этом случае, если вы используете $ _ POST ['type'] [0]
или substr ($ _ POST ['type'], 0, 1)
, вы получите C
назад.
Однако, если клиентская сторона должна была изменить данные, которые они отправили вам, от типа
до type []
, а затем отправить «Control» и «Test» в качестве данных для этого массива, $ _ POST ['type'] [0]
теперь вернет Control
а не C
, тогда как substr ($ _ POST ['type'], 0, 1)
просто просто терпит неудачу.
Итак, проблема с использованием $ str [0]
, но это зависит от окружающего обстоятельства.
if (true === is_string ($ _ POST ['type']))
– fyrye
12 August 2015 в 07:49
Легко получить первый символ строки. Просто обработайте строку как массив.
Пример:
$ first = $ string {0}; $ 5th = $ string {5};
Вот и все!
$ string {5}
даст вам шестой символ, а не пятый.
– BadHorsie
5 June 2018 в 21:14
Я также использовал эту нотацию, без каких-либо побочных эффектов и недоразумений. Это имеет смысл - строка - это всего лишь массив символов.
$ arr [] = $ new_element
) не работают над строками. Таким образом, я не думаю, что придумывать строки как массивы символов полезно.
– Mark Amery
13 March 2017 в 20:03
Мое единственное сомнение в том, насколько применимо этот метод будет в многобайтовых строках, но если это не соображение, то я подозреваю, что вы охвачены. (Если сомневаетесь, mb_substr ()
кажется явно безопасным выбором.)
Однако, с большой картины зрения, мне нужно задаться вопросом, как часто вам нужно получить доступ к 'n '-го символа в строке, чтобы это было ключевым соображением.
Говоря как простой смертный, я бы придерживался $ str [0]
. Насколько мне известно, быстрее понять смысл $ str [0]
с первого взгляда, чем substr ($ str, 0, 1)
. Это, вероятно, сводится к предпочтению.
Что касается производительности, то профиль профиля профиля. :) Или вы могли бы заглянуть в исходный код PHP ...
Он будет меняться в зависимости от ресурсов, но вы можете запустить скрипт ниже и увидеть сами;)
& lt;? php $ tests = 100000; for ($ i = 0; $ i & lt; $ 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 'среднее значение float microtime с использованием массива [] «is». $ avg1. PHP_EOL; $ avg2 = array_sum ($ time2) / $ tests; echo 'среднее поплавок microtime с использованием "substr ()" is'. $ avg2. PHP_EOL; $ avg3 = array_sum ($ time3) / $ tests; echo 'среднее значение float microtime с использованием массива {} "is". $ avg3. PHP_EOL; ? & GT;
Некоторые ссылочные номера (на старой машине CoreDuo)
$ php 1.php Среднее время поплавка с использованием массива [] " 1.914701461792E-6 Среднее поплавок microtime с использованием «substr ()» составляет 2,2536706924438E-6, среднее время поплавка с использованием «array {}» равно 1.821768283844E-6 $ php 1.php. Среднее значение поплавкового микросайт с использованием «array []» равно 1.7251944541931E-6 Среднее значение поплавкового микросайт с использованием «substr ()» равно 2.0931363105774E-6, среднее значение по времени с плавающей точкой с использованием «array {}» равно 1.7225742340088E-6 $ php 1.php Среднее время поплавка с использованием «array []» 1.7293763160706E-6 Среднее поплавок microtime с использованием «substr ()» - это 2.1037721633911E-6, среднее время поплавка с использованием «array {}» равно 1.7249774932861E-6
Кажется, что использование Операторы []
или {}
более или менее одинаковы.
testA
и testB
в пределах тех же циклов означает, что вы способны обнаруживать, например, тот факт, что testB
является кеш-убийцей, тогда как testA
является кэшируемым. Когда они оба находятся в одном цикле, они имеют те же самые тайминги, потому что testB
загрязнено testA
.
– PypeBros
9 August 2016 в 09:01
microtime ()
, будет составлять большая часть разницы во времени, хотя экспериментально это кажется неправдой), нет причин заботиться о крошечной разнице в скорости здесь. Это доля миллионной доли секунды; когда это ever i> будет иметь значение?
– Mark Amery
12 March 2017 в 15:38
mb_substr ($ str, 0, 1, 'utf-8')
, чтобы вы не обрезали многобайтовую строку. – Vic 28 August 2013 в 03:22substr ($ str, 0, 1)
, это смущает, кто читает код. – trante 2 November 2013 в 12:13