PHP文字列検索・部分一致スピードチェック

PHP
スポンサーリンク

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);
「^」は先頭「$」は文末を意味してます。よって完全一致になります。
タイトルとURLをコピーしました