プロが教える店舗&オフィスのセキュリティ対策術

こんばんは。お世話になっております。タイトルにあるように配列内にあるデータを、キーワード検索をしたいと考えておりますが、テキストフォームに入力したキーワードが反映できずにいるため、アドバイスを頂戴したく投函させていただきました。


$string=array(
"1組 男 高木義男 明るい性格 ok",
"2組 女 高島幸子 根暗な性格 ok",
"3組 男 飯田彰浩 前向きな性格 no",
"2組 男 木下敏明 努力家 ok",
"3組 女 結城聡子 心配性な性格 no",
"1組 女 佐藤恵子 明るい性格 ok",
);


以上のような配列があり(各データのスペースはタブ区切りです)、テキストフォームで入力したキーワードを
最後のokとなっているのを条件に、名前の欄と性格の欄から、OR検索(*)をしたいのですが、上手く検索させることが出来ません。

*テキストフォームにてスペースでキーワードを入力したとき、OR検索としたい。

お忙しい中恐縮ですが、ご指導いただけたら幸いです。宜しくお願い致します。


以下が実際に記述している現在のソースです。
(テキストフォームにて入力されたキーワードをGETで送信しています)
$key = urldecode($_GET["key"]);
$key = mb_convert_encoding($key, 'EUC-JP', 'auto');
$key = mb_ereg_replace(" ", " ", $key);
$arr = explode(" ",$key);

foreach($arr as $keyy){
$wherearr[] = "(strstr($site_data_array[2], $keyy) OR strstr($site_data_array[3], $keyy))" ;
}

$wherestr = "(".implode(" OR ",$wherearr).")";

if($key != ""){
for($i=0; $i<$count; $i++){
$site_data = $string[$i];
$site_data_array = explode("", $site_data);
if($wherestr AND trim($site_data_array[4]) == "ok"){
$search_array[] = implode("\t", $site_data_array);//この配列データを表示
}
}
}

A 回答 (2件)

<form method="get">


名前か性格の一部:<input type="text" name="keyword"><br>
<input type="submit" value="検索">
</form>

<?
$pattern="/^.*?\t.*?\t";
if(isset($_REQUEST["keyword"])){
$k=$_REQUEST["keyword"];
$k=preg_quote($k,"/");
if(preg_match("/ /",$k)){$k="(".str_replace(" ","|",$k).")";}
$pattern.=".*?(".$k.".*?\t|\t".$k.".*?)";
}else{
$pattern.=".*?\t.*?\t";
}
$pattern.="ok$/";
//print $pattern."<br>";
$string=array(
"1組\t男\t高木義男\t明るい性格\tok",
"2組\t女\t高島幸子\t根暗な性格\tok",
"3組\t男\t飯田彰浩\t前向きな性格\tno",
"2組\t男\t木下敏明\t努力家\tok",
"3組\t女\t結城聡子\t心配性な性格\tno",
"1組\t女\t佐藤恵子\t明るい性格\tok",
);
foreach($string as $val){
if(!preg_match($pattern,$val)) continue;
print $val."<br>";
}

この回答への補足

yambejpさんへ

こんばんは。早速のお返事をありがとう御座います!
例として掲載した配列の形式が、実際のもの違っていたので(これはもちろん私のせいです!)、実際に取り込んでいる配列の形式にあわせるため、初心者の私にとって馴染みのない正規表現の扱いに、試行錯誤いたしましたが、望んでいる結果を得ることが出来ました。

何か何まで恐縮しながらも、ありがたい気持ちで感謝しております。
ありがとう御座いました!

補足日時:2008/09/15 20:16
    • good
    • 0

たとえばこんな感じでパターンをつくって正規表現でヒットさせてみては?



<form method="get">
名前:<input type="text" name="name"><br>
性格:<input type="text" name="personality"><br>
<input type="submit" value="検索">
</form>

<?
$pattern="/^.*?\t.*?\t";
if(isset($_REQUEST["name"])){
$pattern.=".*?".preg_quote($_REQUEST["name"],"/").".*?\t";
}else{
$pattern.=".*?\t";
}
if(isset($_REQUEST["personality"])){
$pattern.=".*?".preg_quote($_REQUEST["personality"],"/").".*?\t";
}else{
$pattern.=".*?\t";
}
$pattern.="ok$/";
$string=array(
"1組\t男\t高木義男\t明るい性格\tok",
"2組\t女\t高島幸子\t根暗な性格\tok",
"3組\t男\t飯田彰浩\t前向きな性格\tno",
"2組\t男\t木下敏明\t努力家\tok",
"3組\t女\t結城聡子\t心配性な性格\tno",
"1組\t女\t佐藤恵子\t明るい性格\tok",
);
foreach($string as $val){
if(!preg_match($pattern,$val)) continue;
print $val."<br>";
}
?>
    • good
    • 0
この回答へのお礼

yambejpさんへ

おはよう御座います。早速の貴重なアドバイスを有難う御座います!
折角ソースまでご提供していただき、貴重なお時間を割いていただいたのも関らず、とても恐縮なのですが、出来れば1つのフォームから検索したいと思っております。すみません。。

preg_quote();などはじめてみるものもあったりで、とてもスマートに記述できるものなんだぁと、非常に勉強になり、またアドバイスいただいたソースをもとに、ヒントに繋がらないか?と考えてはいるのですが、知識不足なため思うようにヒントに繋がるものが見えずにおります。

ホント、ソースまでご提供していただき恐縮なのですが、1つのフォームからnameと、personalityを両方検索出来るようにしたいと考えていますので、恐れ入りますが、引き続きご指導頂戴できたら幸いです。宜しくお願い致します。

お礼日時:2008/09/15 11:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!