PHP文字列検索・部分一致スピードチェック
前回csvファイルの読み込みのスピードチェックをしましたが、

PHPでCSVファイルの読み込み
CSVファイルの読み込み
.csvファイルは、「,」等の区切り文字で区切られたデータファイルの事です。
リンゴ,バナナ,みかん
区切り文字は、一般的に半角カンマやスペース等が使われるが特に決まっていないので好きな物を指定出来ます。
...
今回は、文字列検索・部分一致に使える関数のスピードチェックをします。
「strpos」「strstr」「preg_match」
今回も、データは郵便番号データ「KEN_ALL.csv」を使います。
strposを使う場合
<?php
$path = './zip/KEN_ALL.CSV';
$fh = @fopen($path, "r");
echo 'csvtest<br />';
$st = microtime(true);
if(!$fh){
echo 'error';
}else{
$i = 1;
$j = 1;
while (!feof($fh)) {
$line = stream_get_line($fh, 1024, "\n");
if($line !== false){
$dat = explode(',',$line);
if(strpos($dat[8],'一円') !== false){
echo $dat[2] . $dat[7] . $dat[8] . '<br />';
$j++;
}
$i++;
}
}
fclose($fh);
echo $i . '件終了<br />';
}
$end = microtime(true);
echo $j . '件マッチ<br />';
echo '処理時間:'.($end - $st).'秒<br />';
?>
124520件終了 24件マッチ 処理時間:0.070470809936523秒(最速)
「strpos」は、先頭でマッチすると「0」を返すので「!= false」ではなく「!== false」を使います。
最速でかつメモリ使用量も少ないので単にマッチしているか確認する場合は「strpos」を使うのが良いでしょう。
strstrを使う場合
<?php
$path = './zip/KEN_ALL.CSV';
$fh = @fopen($path, "r");
echo 'csvtest<br />';
$st = microtime(true);
if(!$fh){
echo 'error';
}else{
$i = 1;
$j = 1;
while (!feof($fh)) {
$line = stream_get_line($fh, 1024, "\n");
if($line !== false){
$dat = explode(',',$line);
if(strstr($dat[8],'一円') !== false){
echo $dat[2] . $dat[7] . $dat[8] . '<br />';
$j++;
}
$i++;
}
}
fclose($fh);
echo $i . '件終了<br />';
}
$end = microtime(true);
echo $j . '件マッチ<br />';
echo '処理時間:'.($end - $st).'秒<br />';
?>
124520件終了 24件マッチ 処理時間:0.072556018829346秒
「strstr」は、多少遅くなりますがマッチした文字列の前後の文字列を取得出来るので便利です。
$str = ‘test@example.com’;
echo strstr($str, ‘@’) . ‘<br />’; // @example.comと表示
echo strstr($str, ‘@’, true); // testと表示
preg_matchを使う場合
<?php
$path = './zip/KEN_ALL.CSV';
$fh = @fopen($path, "r");
echo 'csvtest<br />';
$st = microtime(true);
if(!$fh){
echo 'error';
}else{
$i = 1;
$j = 1;
while (!feof($fh)) {
$line = stream_get_line($fh, 1024, "\n");
if($line !== false){
$dat = explode(',',$line);
if(preg_match('/一円/',$dat[8])){
echo $dat[2] . $dat[7] . $dat[8] . '<br />';
$j++;
}
$i++;
}
}
fclose($fh);
echo $i . '件終了<br />';
}
$end = microtime(true);
echo $j . '件マッチ<br />';
echo '処理時間:'.($end - $st).'秒<br />';
?>
124520件終了 24件マッチ 処理時間:0.078140020370483秒
「preg_match」は、正規表現を使えるので細かい指定が出来ます。
完全一致の場合は、
$str = ‘Test’;
preg_match(“/^Test$/”, $str);
「^」は先頭「$」は文末を意味してます。よって完全一致になります。

