89

我注意到很多开发人员同时使用 strstr 和 strpos 来检查子字符串是否存在。其中之一是首选,为什么?

4

5 回答 5

131

来自 PHP在线手册

如果您只想确定某个特定的针是否出现在 haystack 中,请改用更快且内存占用更少的函数strpos()

于 2011-04-28T14:55:51.583 回答
41

这里有一些其他的答案(+基准)我得到了我的问题,这几乎是一样的(我在问的时候没有意识到你的问题)。


与此同时,我还进行了自己的基准测试,我为每个相关函数(、 和strstr()strpos()运行了 1000000 次。 这是代码: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().

我希望这个测试对某人有用。

于 2011-04-28T19:10:48.010 回答
7

许多开发人员将strpos其用于微优化目的。

strstr仅当结果字符串在布尔上下文中不能被解释为 false 时,使用也才有效。

于 2011-04-28T14:56:36.207 回答
0

strpos() 检测特定针在大海捞针的位置。stristr() 测试针是否在大海捞针中的任何位置

因此 strpos() 更快,内存消耗更少

strstr() 的原因:如果您的针位于字符串的开头,则 strpos 返回 0(因此必须使用 === false 进行检查)

于 2011-04-28T14:56:35.203 回答
-2

我更喜欢strstr()可读性和易于编码.. strpos() !==false 有点混乱..

于 2014-12-19T16:35:39.230 回答