多くの開発者がstrstrとstrposの両方を使用して部分文字列の存在を確認していることに気付きました。それらの1つが好まれていますか?
PHP オンラインマニュアル から:
特定の針がhaystack内で発生するかどうかのみを確認する場合は、代わりに高速でメモリ消費の少ない関数
strpos()
を使用します。
ここ 他にもいくつかの答えがあります(+ベンチマーク) ほぼ 同じ(尋ねるときあなたのことに気づかなかった)。
その間、私は独自のベンチマークテストも行い、関連する各関数(strstr()
、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 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()は、特定の針が干し草の山のどこにあるかを検出します。 stristr()は、針が干し草の山のどこにあるかをテストします
そのため、strpos()はより速く、より少ないメモリ消費です
strstr()の理由:針が文字列の先頭にある場合、strposは0を返します(したがって、=== falseでチェックする必要があります)