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

我想获取字符串的第一个字母,我注意到$str[0]工作得很好。我只是不确定这是否是“良好的实践”,因为这种符号通常用于数组。这个功能似乎没有很好的记录,所以我转向你们告诉我是否它是正确的–在各方面;用这个符号?

或者我应该坚持使用好substr($str, 0, 1)?

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

404625 次浏览

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

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

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

然而,从大局的角度来看,我不得不考虑需要多久访问字符串中的第n个字符才能成为一个关键的考虑因素。

我以前也用过这个符号,没有副作用,也没有误解。这是有道理的——毕竟字符串只是一个字符数组。

作为一个凡人,我会坚持使用$str[0]。就我而言,一眼就能领会$str[0]的意思比substr($str, 0, 1)更快。这可能归结为一个偏好问题。

就性能而言,概要文件概要文件概要文件。:)或者你可以查看一下PHP源代码…

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

假设你只是想要$_POST的一部分的第一个字符,让我们称之为“类型”。并且$_POST['type']目前是'Control'。在这种情况下,如果你使用$_POST['type'][0]或__abc1,你将得到C

然而,如果客户端要修改他们发送给你的数据,例如从typetype[],然后发送'Control'和'Test'作为这个数组的数据,$_POST['type'][0]现在将返回Control而不是C,而substr($_POST['type'], 0, 1)将会失败。

所以,是的,使用$str[0]可能会有问题,但这取决于周围的环境。

它会根据资源而有所不同,但你可以运行下面的脚本,自己看看;)

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

似乎使用[]{}操作符或多或少是相同的。

在多字节(unicode)字符串的情况下,使用str[0]可能会导致问题。mb_substr()是一个更好的解决方案。例如:

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

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

$str = 'abcdef';
echo $str[0];                 // a