使用$ str [0]获取字符串的第一个字符

Tat*_*nen 263 php string substring

我想得到一个字符串的第一个字母,我注意到它的$str[0]效果很好.我只是不确定这是否是"良好实践",因为该符号通常用于数组.这个功能似乎没有很好的记录,所以我转向你们,告诉我是否可以 - 在所有方面 - 使用这种表示法?

或者我应该坚持好'ol' substr($str, 0, 1)

另外,我注意到花括号($str{0})也可以.那是怎么回事?

Hoc*_*ock 373

是.字符串可以看作字符数组,访问数组位置的方法是使用[]运算符.通常在使用中没有任何问题$str[0](我很确定比substr()方法快得多).

两种方法只有一个警告:它们将获得第一个字节,而不是第一个字符.如果您使用多字节编码(例如UTF-8),这一点很重要.如果您想支持它,请使用mb_substr().可以说,这些天你应该总是假设多字节输入,所以这是最好的选择,但它会稍微慢一些.

  • 如果你想要超级安全,你应该使用`mb_substr($ str,0,1,'utf-8')`所以你不要截断多字节字符串. (71认同)
  • 虽然这比```substr($ str,0,1)```更短,更容易记住,但这会让读者感到困惑. (17认同)
  • 方括号和substr()之间的选择在很大程度上取决于偏好,但请注意,应用于空字符串时结果会有所不同.如果$ s =""那么$ s [] ==="",但是substr($ s,0,1)=== false. (10认同)
  • 如果$ s =""则$ s [0]将生成"通知:未初始化的字符串偏移:0",而substr($ s,0,1)则不会. (9认同)
  • PHP $ str [0]是否考虑到可以存在2Byte长字符?UTF等?(即使substr()也没帮助它!) (7认同)
  • 链接到文档:http://www.php.net/manual/en/language.types.string.php#language.types.string.substr (2认同)
  • -1; 虽然模糊不清,但它不是*彻底*假,说*"字符串可以被视为Char Arrays"*是相当误导的; 除了可以使用`[0]`或`{0}`样式索引进行索引之外,它们几乎没有任何共同之处.数组函数不适用于字符串(反之亦然),并且附加到数组的特殊语法(`$ some_array [] = $ new_element`)不适用于字符串. (2认同)

小智 46

自PHP 5.3.0起,不推荐使用{}语法.建议使用方括号.

  • http://docs.php.net/language.types.string:`注意:为了同样的目的,也可以使用大括号访问字符串,如$ str {42}.但是,从PHP 5.3.0开始,不推荐使用此语法.请使用方括号,例如$ str [42] .` (13认同)
  • @VolkerK:在你提供的链接中,我注意到他们删除了他们只留下的PHP手册上的注释:`注意:也可以使用大括号访问字符串,如$ str {42},出于同样的目的.所以我'我想知道他们是否决定使用`{}`从PHP 6开始不再被弃用了 (4认同)

gat*_*sbr 22

假设您只想从$ _POST的一部分中获取第一个字符,我们称之为'type'.那个$ _POST ['type']目前是'Control'.如果在这种情况下,如果你使用$_POST['type'][0],或者substr($_POST['type'], 0, 1)你会C回来.

但是,如果客户端被修改他们给你,从数据typetype[]例如,然后发送"控制"和"测试"作为此数组中的数据,$_POST['type'][0]现在将返回Control,而不是C,而substr($_POST['type'], 0, 1)将只是简单地失败.

所以是的,使用时可能存在问题$str[0],但这取决于周围环境.

  • 作为绕过这个特定问题的旁注,在任何一种情况下都应该始终执行数据验证.`if(true === is_string($ _ POST ['type']))` (2认同)

Joh*_*ker 12

我唯一怀疑的是这种技术对多字节字符串的适用性如何,但如果这不是一个考虑因素,那么我怀疑你被覆盖了.(如果有疑问,mb_substr()似乎是一个明显安全的选择.)

但是,从大局的角度来看,我想知道你需要多久访问"第n个字符的字符串,这是一个重要的考虑因素.


Wil*_*ick 9

它会因资源而异,但你可以运行下面的脚本并亲自看看;)

<?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;
?>
Run Code Online (Sandbox Code Playgroud)

一些参考号码(在旧的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
Run Code Online (Sandbox Code Playgroud)

似乎使用[]{}运算符或多或少相同.

  • 不错的测试!来自3岁的Xeon的一些数字:使用"array []"的平均浮动微量摄影是2.2427082061768E-7使用"substr()"的平均浮动微量摄影是3.9647579193115E-7使用"array {}"的平均浮动微缩时间是2.1522283554077E -7- (2认同)

Ste*_*hen 6

作为一个凡人,我会坚持$str[0].就我而言,$str[0]一眼就能更快地掌握其含义substr($str, 0, 1).这可能归结为偏好问题.

就性能而言,简介配置文件配置文件.:)或者您可以查看PHP源代码......


小智 6

如果使用多字节(unicode)字符串str[0]可能会导致麻烦。mb_substr()是更好的解决方案。例如:

$first_char = mb_substr($title, 0, 1);
Run Code Online (Sandbox Code Playgroud)

这里的一些细节:获取 UTF-8 字符串的第一个字符


Jak*_*ain 5

$str = 'abcdef';
echo $str[0];                 // a
Run Code Online (Sandbox Code Playgroud)

  • -1; OP的问题是这种语法是否是一种不好的做法,而你的回答是......重复语法,没有任何评论?这不是答案. (5认同)