Турецкий символ [dубликат]

Недавно я вижу, что премьер-министр Сингапура опубликовал программу, которую он написал на facebook, есть одна строка, чтобы упомянуть ее.

Логика - это просто «значение & amp; -значение», предположим, что у вас есть 0x0FF0, затем 0FF0 & amp; (F00F + 1), что равно 0x0010, что означает, что самый низкий 1 находится в 4-м бите ..:)

227
задан Tatu Ulmanen 29 December 2009 в 00:27
поделиться

12 ответов

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

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

330
ответ дан Alexis Wilke 16 August 2018 в 04:10
поделиться
  • 1
    Устанавливает ли PHP $ str [0], что могут быть 2-байтовые длинные символы? UTF и т. Д.? (хотя substr () тоже не помогает!) – Tomer W 26 June 2013 в 14:29
  • 2
    Если вы хотите быть супер супер безопасным, вы должны пойти с mb_substr ($ str, 0, 1, 'utf-8') , чтобы вы не обрезали многобайтовую строку. – Vic 28 August 2013 в 03:22
  • 3
    Хотя это короче и легче запомнить, чем substr ($ str, 0, 1) , это смущает, кто читает код. – trante 2 November 2013 в 12:13
  • 4
    Выбор между квадратными скобками и substr () в значительной степени зависит от предпочтений, но имейте в виду, что при применении к пустой строке результат отличается. Если $ s = "& quot; затем $ s [] === & quot ;,, но substr ($ s, 0, 1) === false. – xtempore 6 July 2014 в 03:02
  • 5
    Если $ s = "& quot; то $ s [0] будет генерировать «Примечание: Неинициализированное смещение строки: 0» тогда как substr ($ s, 0, 1) не будет. – chris 28 October 2014 в 13:58

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

39
ответ дан Andy Mercer 16 August 2018 в 04:10
поделиться
  • 1
    docs.php.net/language.types.string : Примечание. Строки также могут быть доступны с помощью фигурных скобок, как в $ str {42}, с той же целью. Однако этот синтаксис устарел с PHP 5.3.0. Вместо этого используйте квадратные скобки, например $ str [42]. – VolkerK 29 December 2009 в 01:24
  • 2
    @VolkerK: по ссылке, которую вы указали, я заметил, что они удалили заметку в руководстве PHP, которое они оставили: Примечание. Строки также могут быть доступны с помощью фигурных скобок, как в $ str {42}, с той же целью. Так что мне интересно, решили ли они, что использование {} больше не устарело с PHP 6 – Marco Demaio 21 February 2012 в 20:58
  • 3
    @MarcoDemaio Ссылка теперь рассказывает, что говорит Майкл Мортон. – Tino 21 February 2014 в 00:27
  • 4
    & quot; не дает указаний на снижение ". - Действительно, сообщение об изъятии было удалено в редакции 304518 - Синтаксис curly-brackets-string-index-accessor-синтаксиса не выделяет уведомления об исключении, хотя исходное уведомление было включено и выключено для PHP 5.x, это не в текущей версии, т. е. мы не должны указывать ее как устаревшую. Связано с ошибкой # 52254 - svn.php.net/repository/phpdoc/en/trunk/language/types/… – VolkerK 15 March 2017 в 13:40
  • 5
    На сегодняшний день (10 мая 18) цитата из любимых PHP docs : Примечание. Строки также могут быть доступны с помощью фигурных скобок, например, в $ 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;   
-4
ответ дан Chris Forrence 16 August 2018 в 04:10
поделиться
  • 1
    Это излишне усложняется для простого примера получения первого символа строки и на самом деле не затрагивает точку вопроса. -1. – Mark Amery 12 March 2017 в 15:55

Рассмотрим следующее:

  & 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 () создает ошибку. Учитывая выбор здесь, я бы пошел с нотной записью.

-3
ответ дан Code Cavalier 16 August 2018 в 04:10
поделиться

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

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

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

1
ответ дан Community 16 August 2018 в 04:10
поделиться

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

21
ответ дан gattsbr 16 August 2018 в 04:10
поделиться
  • 1
    В качестве побочной заметки, чтобы обойти эту проблему, и в любом случае всегда нужно выполнять проверку данных. if (true === is_string ($ _ POST ['type'])) – fyrye 12 August 2015 в 07:49

Легко получить первый символ строки. Просто обработайте строку как массив.

Пример:

  $ first = $ string {0};  $ 5th = $ string {5};   

Вот и все!

-5
ответ дан Glenn Prialde 16 August 2018 в 04:10
поделиться
  • 1
    ОП уже ясно дал понять, что они знают, что этот синтаксис существует; этот ответ ничего не добавляет. -1. – Mark Amery 12 March 2017 в 15:56
  • 2
    Использование фигурных скобок устарело. – reformed 22 March 2017 в 19:49
  • 3
    Игнорируя ужасный синтаксис, $ string {5} даст вам шестой символ, а не пятый. – BadHorsie 5 June 2018 в 21:14
  $ str = 'abcdef';  echo $ str [0];  // a  
4
ответ дан Jakir Hossain 16 August 2018 в 04:10
поделиться
  • 1
    Похоже, что ОП уже это знает. – Jonatas Walker 4 March 2016 в 01:01
  • 2
    -1; вопрос OP заключался в том, был ли этот синтаксис плохой практикой, и вы ответили ... повторяя синтаксис без комментариев? Это не ответ. – Mark Amery 12 March 2017 в 15:32

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

1
ответ дан Kaleb Brasee 16 August 2018 в 04:10
поделиться

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

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

12
ответ дан Martin Tournoij 16 August 2018 в 04:10
поделиться

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

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

6
ответ дан Stephen 16 August 2018 в 04:10
поделиться

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

  & 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  

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

9
ответ дан Willy Stadnick 16 August 2018 в 04:10
поделиться
  • 1
    Хороший тест! Некоторые цифры из 3-летнего Xeon: среднее время микропланшета с использованием массива [] & quot; составляет 2,2427082061768E-7, среднее по времени поплавка с использованием «substr ()» представляет собой 3.9647579193115E-7 среднее по времени поплавка с использованием массива {} & quot; 2.1522283554077E-7 – Ellert van Koperen 2 June 2016 в 06:50
  • 2
    для точных измерений вы должны лучше делать микротрейверы из цикла и не смешивать разные подходы в одном цикле. – PypeBros 4 August 2016 в 09:35
  • 3
    не смешивание выполнения testA и testB в пределах тех же циклов означает, что вы способны обнаруживать, например, тот факт, что testB является кеш-убийцей, тогда как testA является кэшируемым. Когда они оба находятся в одном цикле, они имеют те же самые тайминги, потому что testB загрязнено testA . – PypeBros 9 August 2016 в 09:01
  • 4
    Аналогичным образом, я бы избегал генерации строк или рандомов в тестовых циклах и их готов к массиву поблизости. – PypeBros 9 August 2016 в 09:03
  • 5
    -1; оставляя в стороне сомнительный механизм синхронизации (было бы лучше провести много операций, чем время их по одному, я боялся прочесть это, что только время, проведенное с вызовом microtime () , будет составлять большая часть разницы во времени, хотя экспериментально это кажется неправдой), нет причин заботиться о крошечной разнице в скорости здесь. Это доля миллионной доли секунды; когда это ever будет иметь значение? – Mark Amery 12 March 2017 в 15:38
Другие вопросы по тегам:

Похожие вопросы: