Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 哪种方法是首选的strstr或STRPO?_Php_Strpos_Strstr - Fatal编程技术网

Php 哪种方法是首选的strstr或STRPO?

Php 哪种方法是首选的strstr或STRPO?,php,strpos,strstr,Php,Strpos,Strstr,我注意到许多开发人员同时使用strstr和strpos来检查子字符串的存在。其中一个是首选的吗?为什么?来自PHP: 如果您只想确定 特定的针出现在 干草堆,用得更快,用得更少 记忆密集型功能 相反 strpos()检测大海捞针的位置。stristr()测试针是否在草堆中的任何位置 因此,strpos()更快,占用内存更少 strstr()的原因:如果指针位于字符串的开头,strpos返回0(因此必须使用===false进行检查)许多开发人员使用strpos进行微优化 只有当生成的字符串不能在布

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

来自PHP:

如果您只想确定 特定的针出现在 干草堆,用得更快,用得更少 记忆密集型功能 相反

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

因此,strpos()更快,占用内存更少


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

许多开发人员使用
strpos
进行微优化

只有当生成的字符串不能在布尔上下文中解释为false时,使用strstr才能起作用。

是我对我的问题的一些其他答案(+基准),这几乎是相同的(我问的时候没有意识到你的答案)。


与此同时,我还做了自己的基准测试,我对每个相关函数(
strstrstr()
strpos()
stristr()
stripos()
)运行了1000000次。
代码如下:

<?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()
strstr()
相比是赢家


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

我更喜欢
strstr()
的可读性和易于编码
strpos()==false(错误)
有点让人困惑。

您提到的基准是与substr(而不是strstr)相对的,这是一个完全虚假的解释-
strstrstr()
返回指针之前或之后的所有内容,因此它首先必须执行与
strps()
等效的操作,然后创建子字符串。这就是性能受到影响的地方。这不是微观优化,而是为工作使用正确的功能。如果我想要字符串的位置,我调用
strpos()
。如果我想在那个位置之后使用子字符串,我会调用
strstr()
@Alnitak:我刚才说的。如果您想检查字符串的存在,那么有一个函数用于检查。如果你真的需要这个职位,那么还有另外一个当你在没有实际需要职位的情况下寻找职位时,那很难“为工作使用正确的功能”。其目的显然是优化微秒距离。(这不是你引用的吗?@mario但是没有一个函数的唯一目的是检查子字符串是否存在。一旦您实际找到子字符串(如果找到),子字符串的位置就是自由信息。OTOH,
strstr
做的比要求的多,这就是为什么它慢的原因。@Alnitak:注意,不是新闻。您似乎非常坚持指出性能差异,而且仅此而已。这是微观优化的一个信号。它不会在分析器中产生一个光点。它真正起作用的地方在于代码的可读性。@mario实际上我只关心性能的一点点。我非常关心在工作中使用正确的功能;-)+1、您可以使用STRPO或stripos。不要忘记检查php文档中关于使用===FALSE的警告;详细说明费米奇的评论:我总是使用
if(strpos($haystack,$needle)!==false){//do something}
,从不使用
if(strpos($haystack,$needle)){//do bad things}
<如果
$needle
位于
$haystack
的最开头,则code>strpos将返回0,并且0被视为等于false<代码>(0==false)计算结果为true
(0==false)
的计算结果为false。来自C的人可能会考虑使用strchr函数,但在PHP中它实际上是strstr的别名,因此strpos是一个更好的选择。虽然这个基准测试很有用,但它不测量内存消耗,也不考虑长字符串,比如kbytes或mbytes。哈@user133408长字符串和更大的字节字符串甚至需要更长的时间。
strstr
strtr
太相似了。
strtr
也需要严格比较示例:
('123450','0')
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 
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 & 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