301

我想得到一个字符串的第一个字母,我注意到$str[0]效果很好。我只是不确定这是否是“好习惯”,因为该符号通常与数组一起使用。这个特性似乎没有很好的记录,所以我转向你们告诉我是否可以 - 在所有方面 - 使用这个符号?

还是我应该坚持好的 ol' substr($str, 0, 1)

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

4

9 回答 9

419

是的。字符串可以看作是字符数组,访问数组位置的方法是使用[]操作符。通常使用完全没有问题$str[0](而且我很确定它比substr()方法快得多)。

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

于 2009-12-28T23:31:12.927 回答
52

自 PHP 5.3.0 起,{} 语法已弃用。建议使用方括号。

于 2009-12-28T23:39:37.283 回答
29

假设您只想要 $_POST 的一部分中的第一个字符,我们称之为“类型”。并且 $_POST['type'] 当前是“控制”。如果在这种情况下,如果你使用$_POST['type'][0],否则substr($_POST['type'], 0, 1)你会C回来的。

但是,如果客户端要修改他们发送给您的数据,例如 from typeto type[],然后发送 'Control' 和 'Test' 作为该数组的数据,现在$_POST['type'][0]将返回Control而不是简单地失败。Csubstr($_POST['type'], 0, 1)

所以是的,使用 可能存在问题$str[0],但这取决于周围的情况。

于 2013-05-06T14:53:48.527 回答
13

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

但是,从大局的角度来看,我不得不想知道您需要多久访问一次字符串中的第 'n' 个字符,这是一个关键的考虑因素。

于 2009-12-28T23:31:43.850 回答
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;
?>

一些参考编号(在旧的 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

似乎使用[]or{}运算符或多或少是相同的。

于 2014-01-30T19:18:57.220 回答
8

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

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

这里有一些细节:Get first character of UTF-8 string

于 2014-10-16T07:38:37.967 回答
8
$str = 'abcdef';
echo $str[0];                 // a
于 2015-03-12T07:06:06.493 回答
7

作为一个凡人,我会坚持下去$str[0]。在我看来,$str[0]一目了然的意思比substr($str, 0, 1). 这可能归结为一个偏好问题。

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

于 2009-12-28T23:32:57.887 回答
1

我以前也使用过这种表示法,没有不良副作用,也没有误解。这是有道理的——毕竟,字符串只是一个字符数组。

于 2009-12-28T23:32:28.637 回答