我注意到许多开发人员同时使用strstr和strpos来检查子字符串是否存在。是其中之一吗?为什么?
Answers:
if(strpos($haystack,$needle) !== false) { // do something }
,从不使用if(strpos($haystack,$needle)) { // do bad things }
。strpos
如果的$needle
开头是$haystack
,则将返回0 ,并且0等于false。(0 == false)
评估为true。(0 === false)
评估为假。
这是我对问题的其他答案(+基准),几乎是相同的(问时我没有意识到您的问题)。
在此期间,我还做了我自己的基准测试,我跑了100万倍每个相关的功能(strstr()
,strpos()
,stristr()
和stripos()
)。
这是代码:
<?php
function getmicrotime() {
list($usec, $sec) = explode(" ", microtime());
return ((float) $usec + (float) $sec);
}
$mystring = 'blahblahblah';
$findme = 'bla';
echo 'strstr & strpos TEST:<pre>';
$time_start = getmicrotime();
for($i=0; $i<1000000; $i++) strstr($mystring, $findme);
$time_needed_strstr = getmicrotime() - $time_start;
echo 'strstr(): ',
round( $time_needed_strstr , 8 ). PHP_EOL;
$time_start = getmicrotime();
for($i=0; $i<1000000; $i++) stristr($mystring, $findme);
$time_needed_stristr = getmicrotime() - $time_start;
echo 'stristr(): ',
round( $time_needed_stristr , 8 ) . PHP_EOL;
$time_start = getmicrotime();
for($i=0; $i<1000000; $i++) strpos($mystring, $findme) !== false;
$time_needed_strpos = getmicrotime() - $time_start;
echo 'strpos() !== false: ',
round( $time_needed_strpos , 8 ) . PHP_EOL;
$time_start = getmicrotime();
for($i=0; $i<1000000; $i++) stripos($mystring, $findme) !== false;
$time_needed_stripos = getmicrotime() - $time_start;
echo 'stripos() !== false: ',
round( $time_needed_stripos , 8 ) . PHP_EOL;
echo PHP_EOL;
echo 'time_needed_stristr - time_needed_strstr: ',
round( $time_needed_stristr - $time_needed_strstr , 8) . PHP_EOL;
echo 'time_needed_stripos - time_needed_strpos: ',
round( $time_needed_stripos - $time_needed_strpos , 8) . PHP_EOL;
echo PHP_EOL;
echo 'time_needed_strstr - time_needed_strpos: ',
round( $time_needed_strstr - $time_needed_strpos , 8) . PHP_EOL;
echo 'time_needed_stristr - time_needed_stripos: ',
round( $time_needed_stristr - $time_needed_stripos , 8) . PHP_EOL;
echo '</pre>';
?>
这是第一个输出,显示出strpos()
获胜者:
strstr & strpos TEST:
strstr(): 2.39144707
stristr(): 3.65685797
strpos() !== false: 2.39055395
stripos() !== false: 3.54681897
time_needed_stristr - time_needed_strstr: 1.2654109
time_needed_stripos - time_needed_strpos: 1.15626502
time_needed_strstr - time_needed_strpos: 0.00089312
time_needed_stristr - time_needed_stripos: 0.110039
下一个类似于第一个输出(strpos()
再次是获胜者):
strstr & strpos TEST:
strstr(): 2.39969015
stristr(): 3.60772395
strpos() !== false: 2.38610101
stripos() !== false: 3.34951186
time_needed_stristr - time_needed_strstr: 1.2080338
time_needed_stripos - time_needed_strpos: 0.96341085
time_needed_strstr - time_needed_strpos: 0.01358914
time_needed_stristr - time_needed_stripos: 0.25821209
下面是另一个,更有趣,因为在这种情况下strstr()
是获胜者:
strstr & strpos TEST:
strstr(): 2.35499191
stristr(): 3.60589004
strpos() !== false: 2.37646604
stripos() !== false: 3.51773095
time_needed_stristr - time_needed_strstr: 1.25089812
time_needed_stripos - time_needed_strpos: 1.14126492
time_needed_strstr - time_needed_strpos: -0.02147412
time_needed_stristr - time_needed_stripos: 0.08815908
这意味着它确实可以依赖于有时很难影响的“环境”,并且可以更改“微优化任务”的结果,以防您只是检查一个字符串是否存在于另一个字符串中。
但我认为在大多数情况下,strpos()
与相比是赢家strstr()
。
我希望这个测试对某人有用。
许多开发人员将其strpos
用于微优化目的。
strstr
仅当在布尔上下文中不能将结果字符串解释为false时,使用也才有效。
strpos()
。如果需要该位置后的子字符串,请致电strstr()
。
strstr
做多比是必需的,这就是为什么它的速度较慢。
我更喜欢strstr()
可读性和易于编码.. strpos() !==false
有点令人困惑。
strstr
过于类同strtr
strstr
也需要严格的比较例如:('123450', '0')