Я хочу получить первую букву строки, и я заметил, что это $str[0]
прекрасно работает. Я просто не уверен, является ли это «хорошей практикой», так как эта запись обычно используется с массивами. Эта функция не очень хорошо документирована, поэтому я обращаюсь к вам, ребята, чтобы сказать мне, все ли в порядке - во всех отношениях - использовать эту запись?
Или я должен просто придерживаться старого доброго substr($str, 0, 1)
?
Также я заметил, что фигурные скобки ( $str{0}
) также работают. Что с этим?
Ответы:
Да. Строки можно рассматривать как символьные массивы, и способ доступа к позиции массива заключается в использовании
[]
оператора. Обычно в использовании нет никаких проблем$str[0]
(и я уверен, что это намного быстрее, чемsubstr()
метод).С обоими методами есть только одно предупреждение: они получат первый байт , а не первый символ . Это важно, если вы используете многобайтовые кодировки (такие как UTF-8). Если вы хотите поддержать это, используйте
mb_substr()
. Возможно, вы должны всегда предполагать многобайтовый ввод в эти дни, так что это лучший вариант, но он будет немного медленнее.источник
mb_substr($str, 0, 1, 'utf-8')
чтобы не обрезать многобайтовую строку.substr($str, 0, 1)
, это сбивает с толку тех, кто читает код.Синтаксис {} устарел, начиная с PHP 5.3.0. Квадратные скобки рекомендуются.
источник
Note: Strings may also be accessed using braces, as in $str{42}, for the same purpose. However, this syntax is deprecated as of PHP 5.3.0. Use square brackets instead, such as $str[42].
Note: Strings may also be accessed using braces, as in $str{42}, for the same purpose.
поэтому мне интересно, решили ли они, что использование{}
НЕ устарело с PHP 6The curly-brackets-string-index-accessor-syntax does not emit any deprecation notice, although the original notice have been on and off for PHP 5.x, it does not in the current version, thrus we should not label it as deprecated. Related to bug #52254
- svn.php.net/repository/phpdoc/en/trunk/language/types/…Note: Strings may also be accessed using braces, as in $str{42}, for the same purpose.
похоже, этот синтаксис останется на некоторое время.Допустим, вам нужен только первый символ из части $ _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]
, но это зависит от окружающих обстоятельств.источник
if (true === is_string($_POST['type']))
Единственное, в чем я сомневаюсь, это то, насколько применим этот метод к многобайтовым строкам, но если это не так, то я подозреваю, что вы защищены. (Если сомневаетесь,
mb_substr()
кажется, очевидно, безопасный выбор.)Однако, с точки зрения общей картины, я должен задаться вопросом, как часто вам нужен доступ к n-му символу в строке, чтобы это было ключевым фактором.
источник
Это будет зависеть от ресурсов, но вы можете запустить скрипт ниже и убедиться сами;)
Некоторые ссылочные номера (на старой машине с CoreDuo)
Представляется , что использование
[]
или{}
операторов более или менее то же самое.источник
testA
иtestB
внутри одного и того же цикла означает, что вы способны обнаружить, например, тот факт, чтоtestB
кеш-убийца, аtestA
кеш-дружественный. Когда они оба находятся в одной и той же петле, у них одинаковые тайминги, потому что кешированиеtestB
загрязненоtestA
.microtime()
вызова, будет составлять большую часть разницы во времени, хотя экспериментально это кажется чтобы не быть правдой), здесь нет причин беспокоиться о крошечной разнице в скорости. Это доля миллионной доли секунды; когда это когда-либо будет иметь значение?Говоря как простой смертный, я бы придерживался
$str[0]
. Насколько мне известно, быстрее понять значение с первого$str[0]
взгляда, чемsubstr($str, 0, 1)
. Это, вероятно, сводится к вопросу предпочтений.Что касается производительности, ну, профиль профиль профиль. :) Или вы можете заглянуть в исходный код PHP ...
источник
источник
В случае использования многобайтовых (юникодных) строк
str[0]
может возникнуть проблема.mb_substr()
это лучшее решение. Например:Некоторые детали здесь: Получить первый символ строки UTF-8
источник
Я использовал эту запись и раньше, без побочных эффектов и недоразумений. Это имеет смысл - в конце концов, строка - это просто массив символов.
источник
$str[42]
. Думайте о строке как о массиве символов для этой цели. Внутренне строки PHP являются байтовыми массивами.$arr[] = $new_element
) не работает со строками. Поэтому я не думаю, что представление строк как символьных массивов полезно.