配列データをキーワード検索する方法とは?

このQ&Aのポイント
  • 配列データ内の名前と性格からキーワードを検索する方法についてのアドバイスをお願いします。
  • テキストフォームで入力したキーワードを使用してOR検索を実行する方法について教えてください。
  • 配列データ内のOKの条件を満たす名前と性格を表示する方法についての助言をお願いします。
回答を見る
  • ベストアンサー

配列データをキーワード検索

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

  • PHP
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.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>"; }

mayu_chap
質問者

補足

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

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

たとえばこんな感じでパターンをつくって正規表現でヒットさせてみては? <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>"; } ?>

mayu_chap
質問者

お礼

yambejpさんへ おはよう御座います。早速の貴重なアドバイスを有難う御座います! 折角ソースまでご提供していただき、貴重なお時間を割いていただいたのも関らず、とても恐縮なのですが、出来れば1つのフォームから検索したいと思っております。すみません。。 preg_quote();などはじめてみるものもあったりで、とてもスマートに記述できるものなんだぁと、非常に勉強になり、またアドバイスいただいたソースをもとに、ヒントに繋がらないか?と考えてはいるのですが、知識不足なため思うようにヒントに繋がるものが見えずにおります。 ホント、ソースまでご提供していただき恐縮なのですが、1つのフォームからnameと、personalityを両方検索出来るようにしたいと考えていますので、恐れ入りますが、引き続きご指導頂戴できたら幸いです。宜しくお願い致します。

関連するQ&A

  • Smartyの自作プラグインで配列を扱えません

    Smartyで、配列であった場合に、implodeで結合させるプラグインを作りたいのですが、思うように動作しません。 テンプレート内で、次のように記述しています。 {foreach from=$value item=i}  {$i->note|ketugou} {/foreach} ketugouプラグインでは次の通りです。 function smarty_modifier_ketugou($key){ if (is_array($key)) { return implode(', ', $key); } else { return $key; } } 上記の場合、表示されるのは'Array'のみです。 プラグインで配列かどうかを確認せずに実行すると、次のエラーが出ます。 Warning: implode() [function.implode]: Bad arguments. in。。。 テンプレート上では配列であったのが、プラグインに渡すと配列ではなく、stringとなっていて要素数分実行されています。プラグインからのエラーは配列じゃないからなのですが、どう対処すればいいのでしょうか。

    • ベストアンサー
    • PHP
  • キーワード検索

    ,で区切られた複数のキーワードがあり、そのキーワードが全て入っている文字列のみを抽出したいと思っています。 キーワードの数は固定ではありません。 ,で区切られたキーワードを分解して配列にし、 絞り込んでいきたいのですが、どうしたらいいのかわかりません。 $keyword = explode("," , $sample); foreach($data as $val){ list($id,$nakami) = explode("," , $val); for($i=0; $i < count($keyword); $i++){ if(ereg($keyword[$i] , $nakami)){ echo "$test"; } } } としても一つのキーワードが入っていれば表示される状態です。

    • ベストアンサー
    • PHP
  • 配列型の宣言?

    こんにちは。 あるサイトで見たphpのサンプルなのですが、 postされた全ての値を配列に格納するもので、以下のような記述がありました。 foreach((array)$_POST as $key => $value){  $array[$key] = $value; } ポストされた全ての値を、配列$arrayに連想配列として格納しているのはわかるのですが、 foreachの、(array)というのはどういう働きをするものなのでしょうか。 これは、$_POSTが配列であるという宣言でしょうか。 それと、postされた値がない場合、$_POSTを配列だと宣言しておくことで、foreachのエラーを回避するような役割もあるのでしょうか。 恥ずかしながら、(array)のような記述をphpではあまり見ないような気がするのですが、なんというキーワード(?)で勉強すれば理解が深められるかもご教授頂けますと助かります。 宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • 2次元配列から1次元配列へのデータ読み込み方法をお尋ねします。

    いつもお世話になります。 readtest.csvというCSVファイルを作り、データを次のように入れています。 a,apple,301,23 b,orange,518,47 c,grape,278,19 d,banana,189,36 この3列目のデータを取り出して1次元配列に入れるため、DBtest.phpを次のように書きました。 01: <?php 02: $Data=file("../readtest.txt"); 03: for ( $i = 0; $i < sizeof( $Data ); $i++ ) { 04: $line=explode(",",$Data[$i]); 05: echo $line[2]; // 301518278189 06: // $xdata=implode(",", $line[2]); 07: } 08: ?> この実行結果は、「301518278189」となります。なぜコンマが入らないのでしょうか? 5行目をコメントアウトして6行目を生かして実行すると、 Warning: implode() [function.implode]: Bad arguments. in C:\Program Files\Apache Group\Apache2\htdocs\DBtest.php on line 6 となります。 3列目のデータを抜き出して配列を作るにはどのようにすれば良いでしょうか? よろしくご教示頂ければ幸いです。

    • ベストアンサー
    • PHP
  • 配列のキー取得

    現在の$str配列には、下記のようになっています。 Array ( [9] => test [5] => aaa [7] => bbb) print_r(array_keys($str)); とすると下記のように配列のキー値がわかりますが、 Array ( [0] => 9 [1] => 5 [2] => 7) キーを下記のように一つづつほかの配列に代入したい場合はどのようにしたらいいのでしょうか? for($i=0;$i<count($str);$i++){ $new_str[$i]=キーを取得する関数; } ご教授お願いいたします。

    • ベストアンサー
    • PHP
  • cakephpでキーワード検索

    すみません。いろいろやってみたんですが 断念して、ここに投稿しました。 検索キーワードでページングするための方法がわかりません。 例)東京 寿司屋 このようにスペースで単語ごとに区切ります。 一文字だけは成功しましたが、スペースを空けて単語を読みとる 方法が浮かびません。 $keyword = mb_convert_kana($this->data["Hoge"]["keyword"],'rnask'); $keywords = preg_split("/[\s]+/",$keyword); $set = array(); $set = array( 'OR' => array( 'Hoge.name LIKE' => '%'.$keywords[0].'%', 'Hoge.prefecture LIKE' => '%'.$keywords[0].'%', 'Hoge.job LIKE' => '%'.$keywords[0].'%', ), //'OR' => array( //'Hoge.name LIKE' => '%'.$keywords[1].'%', //'Hoge.prefecture LIKE' => '%'.$keywords[1].'%', //'Hoge.job LIKE' => '%'.$keywords[1].'%', //), // コメントをはずしてみると、案の定エラーこきます。 'Hoge.cp_flag' => 1, ); $this->set("hogehoes",$this->paginate('Hoge',$set,null)); お願いします。どなたかお助け下さい。

    • ベストアンサー
    • PHP
  • 配列の中の一部を削除する方法がわかりません。

    配列の中の一部を削除する方法がわかりません。 Javascriptに、連想配列はないと、どこかのサイトで書いてありましたが やりたいことは、ある配列(連想配列)というより、オブジェクト?があり、 そこにキーと対応すrる値があるデータがあります。 キーを手がかりに、削除して一部のデータを削除する書き方を教えて欲しいです。 例えば var a = new Array(); for (var i = 0; i < 10; i++) { a[i] = [i]; } // この段階では、0=>[0], 1=>[1] ... 9=>[9]のデータがありますが、 // a[3] a[5] a[8]のデータをここで削除したい。 // 今回は、数値がキーですが文字列の場合も可能でしょうか? ??? for ( var i = 0; i < a.length; i++) { alert(a[i]); } // 7個のデータが表示される。 よろしくお願いいたします。

  • 不要な配列を消したい

    2次元配列で、不要な要素を取り除きたいのですが良い方法が思い浮かばず、どうしたものかと悩んでいます。 一番初めと5番目を消したいのですが、preg_match で日付の2006にマッチしない要素をunsetしてみましたがうまくいきませんでした。 $data = array ( array('<br>'), array("2006 03 22", test), array("2006 03 23", test2), array("2006 03 25", test3), array('') ); $pattern = '/2006/'; foreach($data as $key => $value) { if(preg_match($pattern, $value[$key])) { unset($data[$key]); } } もし方法をご存知のかたおられましたらよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • DBIを使用してデータを連想配列に「入れたい。

    MySQLとDBIを使って、テーブルから取り出したデータの、カラムの名前をキー、フィールド値をバリューとした連想配列を作りたいのですが、どうすればいいでしょうか?? fetchrow_arrayの使い方は分かっているのですが、fetchrow_arrayだと配列しか作れないみたいなので・・ハッシュにしたいのです。 分かる方いらっしゃいましたらご教授よろしくお願いします。

    • ベストアンサー
    • Perl
  • 配列の受け渡し

    失礼致します。 配列について困っていまして、質問させてください。 今、フォームデータとしてsubmitを押したときにjavascriptから配列をサーブレットに受け渡ししたいです。フォームを含めたソースは次のようになります。 <script> function submitArr(n) { var i = 0; var array = []; while(i<n) { array.push(variable); // variableはiの値に応じて変わる変数。 } document.frm.array.value = array; ☆ } </script> <form action="servlet" method="post" name="frm"> <input type = "submit" value = "submit" onClick="submitArr()"> <input type = "hidden" value = "" name="array"> ☆ </form> 次に、servlet側でこれを受け取ります。 String[] array = new String[n]; ★ while(i<n) { array[i] = req.getParameter(array[i]); ★ } 以上が本質的な部分だと思うのですが、☆および★の部分をどう書いたらいいかわかりません。 添え字も少しあやふやなのですが、 分かる人がおられましたら、教えていただけないでしょうか?

    • ベストアンサー
    • Java

専門家に質問してみよう