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



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



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



кроме того, я отметил, что фигурные скобки ($str{0}) работает хорошо. Что - ну и что?

541   12  

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...

$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};

вот именно!

Comments

    Ничего не найдено.