ちょっとハマったので、メモしておきます。
CSVファイルの特定のフィールドの重複チェックのスクリプトを書いていた時でした。
最初は、CSVだからとfgetcsvを素直に使いました。
やり方は、シンプルに1つをファイルをファイルポイントを2つつくり、
二重のwhile文で回して、オーソドックスに比較する方法。
しかし、一度チェックした行は、最初からもう比較しなくていいわけです。
「A,B,A,C,D」の中の重複チェックは、最初のAに対して、3番目のAを見つけた後は、
二番目のBは、三番目のAからチェックすればいいわけです。
三番目のAは、四番目のCからチェックすればいいわけです。
while文で回すと、最初からになってしまいます。
while文が悪いのではなく、fgetcsvもfgetsも、行数を指定して読み込めないからなのです。
$f_array=file(指定のCSV) としておく、配列なので、指定の行数を一発で読み込めます。
すなわち、行数の始まりを変えて、whileを回せば、配列化されている場合の方が
効率的ということです。
5 x 5 x 5 x 5 x 5のチェックよりも、5 x 4 x 3 x 2 x 1の方が数が少ないというイメージです。
千行以上のCSVでしたので、かなり速度が違いました。
あと、CSVがダブルクォーテーションで囲まれている時は、fgetcsvは勝手にダブルクォーテーションを外してくれす。fileで読み込んで、たんにexplode(“,”,一行)とした時は、ダブルクォーテーションを外してくれません。そこも、ちょっと注意でした。
やっぱり、CSVを読み込んでなにかする時は、
$array=file(CSVファイル);
foreach($array as $line){
$line=str_replace(‘”‘,”,$line);
$rows=explode(“,”,$line);
}
の流れが、何でもできます。
while文で、途中から読み込むこともできますし。内側のループが、5 x 4 x 3 x 2 のように繰り返し数が少なくなっていきます。
while($c < 10){
while($c < 10){
}
$c++;
}