• 締切済み

配列の中身で、データを検索したい

いつもお世話になっております。 あるデータがPOSTされたとき、そのデータが配列のワードを含むかどうかを検索したいのですが、総当りのeregでは非効率です。(ワードが多いため) 一度の処理でPOSTされたデータ(文字列)が配列のワードを含むかの判断をするとき、何か効率のよい方法はないでしょうか? たとえば、in_arrayで前方一致ができたなら、それに越したことはないですね。でもin_arrayは完全一致なので今回は使えないです。 よろしくお願いします。

みんなの回答

  • sdt6
  • ベストアンサー率0% (0/0)
回答No.2

以前、preg_replaceで配列の検索パターンにマッチした文字を削除し、元の文字列と比べるっていうのをやったことがありました。 効率がいいかどうか分からないのですが、こんな↓感じです。 function chkStr($pattern, $str){ $rtn = false; if ($str != preg_replace($pattern, '', $str)) { $rtn = true; } return $rtn; }

nyalio
質問者

お礼

パターンにもってくるのが配列の中身だとすると、結局要素分あたらないと削除後の文字列はできない、ということでしょうか。 んー、今回の件では微妙ですが、何かしら役に立ちそうな方法ですね! A1さんと同様、似たような状況に陥ったら使わせていただきます。 ありがとうございました。

回答No.1

前方一致で良いのであれば、配列のワードにindexをつけておくなんてのはいかがでしょう? $_POST['q'] = 'あい'; $array = array('あいうえお','かきくけこ','さしすせそ'); こんな状態にindexをつけると、 $array = array('あ'=>array('あいうえお'),'か'=>array('かきくけこ'),'さ'=>'さしすせそ'); こんな状態になります。 つまり、$array['あ']の配列を総当りすれば良いって感じですね。 実際には先頭○バイトのord + dechexで連結した文字などをindexとしてあげると良いんじゃないかと思います。 配列が数万とかあるのであれば、更にindexを増やして二重のindexを作ってあげるとか。 こんな感じではいかがでしょうか。

nyalio
質問者

お礼

回答ありがとうございます。 今回の配列は、index化が難しそうなので教えていただいた方法が使えるかどうかは微妙ですが、なるほどーと思いました。 いつか同じような状況に陥ったときの選択肢として使わせていただきます。 ありがとうございました

関連するQ&A