PHPでNGワード判定する(&csv読み込み処理速度比較)

Programming

PHPでNGワード判定する機会があったのでそのメモと、PHPで.csvファイルを読み込んで配列に変換する際の処理速度比較です。(fgetcsv/str_getcsv/SplFileObject)

PHPでNGワード判定する

NGワードにしたい単語を「,(カンマ)」区切りで羅列したcsvファイルを用意し、以下のように処理してあげればOK

$file = new SplFileObject("NGlist.csv"); $file->setFlags(SplFileObject::READ_CSV); 
foreach ($file as $line){
  $NGwords[] = $line;
}

$NGflag = 0;
foreach($NGwords[0] as $word){
  if(stripos($text,$word) !== false){
    $NGflag = 1;
    break;
  }
}

if($NGflag)
  echo "NGワードが含まれています";
else
  echo "NGワードは含まれていません";

PHPでCSVファイルを読み込む際の速度比較

PHPでcsvファイルを読み込む際の選択肢として「fgetcsv」「str_getcsv」「SplFileObject」などの関数があります。それぞれの実行速度を比較したメモ書きです。

計測には「住所.jp」さんのcsvデータを使用しました。(約15万行,22MB)

fgetcsv

「php csv」とかで検索するとたくさん出てくるのがコレ。

$time_start = microtime(true);

$file = fopen("zenkoku.csv","r");

while( ($line = fgetcsv($file) ) !== false){
  $array[] = $line;
}

fclose("zenkoku.csv");

$time = microtime(true) - $time_start;
echo $time."秒";

結果:1.715秒

str_getcsv

PHPバージョン5.3.0以上でのみ使用可能

指定文字でパースすることができます。

$time_start = microtime(true);

$file = str_getcsv(file_get_contents("zenkoku.csv"), "\r\n");

foreach ($file as $line){
  $array[] = str_getcsv($line);
}
$time = microtime(true) - $time_start;
echo $time."秒";

結果:2.148秒

SplFileObject

ファイル読み込み用のオブジェクト指向インターフェイス

$time_start = microtime(true);

$file = new SplFileObject("zenkoku.csv");
$file->setFlags(SplFileObject::READ_CSV);

foreach ($file as $line){
  $NGwords[] = $line;
}

$time = microtime(true) - $time_start;
echo $time."秒";

結果:1.385秒

まとめ

PHPでcsvファイルを読み込むなら「SplFileObject」がおすすめ

 

おわり。

[参考]:【PHP】その CSV 変換、本当に「fgetcsv」でいいの?