使用$ str获取string的第一个字符

我想获得一个string的第一个字母,我注意到$str[0]很好。 我只是不确定这是否是“好的做法”,因为这个符号通常用于数组。 这个function似乎没有很好的logging,所以我转向你们告诉我,如果这是正确的 – 在所有方面 – 使用这个符号?

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

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

是。 string可以被看作字符数组,而访问数组位置的方法是使用[]运算符。 通常使用$str[0]没有问题(我敢肯定比substr()方法快得多)。

这两种方法只有一个警告:他们会得到第一个字节 ,而不是第一个字符 。 如果您使用多字节编码(如UTF-8),这一点很重要。 如果你想支持,使用mb_substr() 。 可以说,现在应该总是假设多字节input,所以这是最好的select,但是会稍微慢一些。

从PHP 6开始,{}语法已被弃用。build议使用方括号。

比方说,你只是想从$ _POST的一部分的第一个字符,让我们称之为“types”。 那$ _POST ['type']现在是'Control'。 如果在这种情况下,如果你使用$_POST['type'][0]substr($_POST['type'], 0, 1)你会得到C回来。

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

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

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

然而,从macros观的angular度来看,我不得不考虑多久你需要访问一个string中的第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] 。 就我而言,一眼就能比substr($str, 0, 1)更快掌握$str[0]的含义。 这可能归结为一个优先事项。

就性能而言,好,轮廓configuration文件。 :)或者你可以点对点的PHP源代码…

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

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

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

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

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

考虑以下:

 <?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转换为数组types来混淆问题,但使用array-subscript表示法会产生安全的错误结果,而substr()函数会产生错误。 鉴于这里的select,我会用下标符号去。

这就是我解决问题的方法:

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

获取string的第一个字符很容易。 只要将string视为一个数组。

例:

 $first = $string{0}; $fifth = $string{5}; 

而已!