PHPでCSVを用いた場合のあいまい検索
水曜日, 20 1月 2010
もう一つPHPでつまづいたのでメモ。
1つ前のエントリーで書いた「2次元配列のソート」と同時につまったのが、「CSVデータの中身をあいまい検索」。
SQLならそもそもLikeコマンドがあるからいいんですけど、CSVデータだとただの配列なのでどーしたものかと。
これもすごく悩みました。
さっさと結論を書くと、配列を要素数分forかなんかで回して、similar_textでマッチする文字数を検索でした。
similar_textは比較対象と検索文字の類似性を求める関数です。
って、わかりづらいですね。コード書きます。
//$itemsは元の配列
//$cは合致した文字数
//$wordは検索文字
for($i=0;$j<count($items);$i++){
$c=similar_text($word,$items[$i]);
if($c==strlen($word)){
//合致した場合の処理
}
}
ここでのポイントは元の検索文字のバイト数とsimilar_textを用いて得られた結果の文字数で整合性を取っている部分です。
ここを同じにしておかないと、検索元の文字の一部が含まれているだけで合致したことになってしまうので・・・。
けど、そこは「もしかしたら~」の検索に使えるかもですね。
No. 1 — 2月 9th, 2010 at 2:07 AM
LIKE的な事をしたい場合は正規表現という手もありますよ。
preg_match
です。
正規表現を抑えるといろんな事ができるようになりますよ。
単純に文字列を含むかどうかならstrposが高速です。
とはいえ、レコード数が一定量を超えたら
SQLiteなどの組み込みのDBにデータを入れて、
インデックスを張った方が高速です(笑)
No. 2 — 2月 9th, 2010 at 11:08 AM
正規表現ですか~。いまいち覚えれないんですよねー。SQLiteもやってみたいけど、FlashがきりがつかなくてPHPまで追い付かない^^;