我想获取字符串的第一个字母,并且我注意到它的$str[0]
效果很好。我只是不确定这是否是“好的做法”,因为该符号通常用于数组。这个功能似乎没有得到很好的记录,因此我想请大家告诉我在所有方面都可以使用此符号吗?
还是我应该坚持好礼substr($str, 0, 1)
?
另外,我注意到花括号($str{0}
)也适用。那是怎么回事?
我想获取字符串的第一个字母,并且我注意到它的$str[0]
效果很好。我只是不确定这是否是“好的做法”,因为该符号通常用于数组。这个功能似乎没有得到很好的记录,因此我想请大家告诉我在所有方面都可以使用此符号吗?
还是我应该坚持好礼substr($str, 0, 1)
?
另外,我注意到花括号($str{0}
)也适用。那是怎么回事?
Answers:
是。字符串可以看作是字符数组,访问数组位置的方法是使用[]
运算符。通常,使用完全没有问题$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 6起不再弃用
The 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/...
假设您只希望$ _POST的一部分中的第一个字符,将其称为“类型”。$ _POST ['type']当前为“控件”。如果在这种情况下使用$_POST['type'][0]
,substr($_POST['type'], 0, 1)
则将C
返回。
但是,如果客户端被修改他们给你,从数据type
到type[]
例如,然后发送“控制”和“测试”作为此数组中的数据,$_POST['type'][0]
现在将返回Control
,而不是C
,而substr($_POST['type'], 0, 1)
将只是简单地失败。
所以是的,使用可能存在问题$str[0]
,但这取决于周围的环境。
if (true === is_string($_POST['type']))
它会因资源而异,但是您可以运行下面的脚本,自己看看;)
<?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 {}
运算符大致相同。
testA
和testB
相同的循环意味着你能够检测例如在事实中testB
是一个高速缓存,而凶手testA
是缓存友好。当它们都处于同一循环中时,由于testB
污染testA
的缓存,它们被测量为具有相同的时序。
microtime()
通话所花费的时间会弥补大部分时差,尽管从实验上看,这似乎(不是真的),这里没有理由关心微小的速度差异。不到一秒的百万分之一;这什么时候重要?
$str = 'abcdef';
echo $str[0]; // a
如果使用多字节(unicode)字符串,str[0]
可能会造成麻烦。mb_substr()
是更好的解决方案。例如:
$first_char = mb_substr($title, 0, 1);
这里有一些细节:获取UTF-8字符串的第一个字符
我以前也使用过这种表示法,没有不良的副作用,也没有误解。这是有道理的-毕竟,字符串只是字符数组。
$str[42]
。为此,可以将字符串视为字符数组。在内部,PHP字符串是字节数组。
$arr[] = $new_element
)不适用于字符串。因此,我认为将字符串理解为字符数组是没有用的。