• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:キーワード検索)

キーワード検索方法を知りたい

このQ&Aのポイント
  • キーワード検索方法を知りたいです。キーワード検索は、複数のキーワードが含まれている文字列のみを抽出するための方法です。
  • キーワードの数は固定ではなく、カンマで区切られたキーワードを分解して配列にし、絞り込んでいくことができます。
  • 現在は一つのキーワードが含まれていれば表示される状態ですが、複数のキーワードが全て含まれている文字列のみを抽出する方法を知りたいです。

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

  • ベストアンサー
回答No.1

元データや目的などが解らないのでアイデアだけ。 //元の$data配列をハッシュにしてみる $temp_moto_arr = array(); foreach($data as $val){ list($id,$nakami) = explode("," , $val); $temp_moto_arr[$id] = $nakami; } //結果を表示してみる var_dump($temp_moto_arr); //$temp_moto_arrにマッチする結果を更に配列にしてみる $temp_last_arr = array(); $keyword = explode("," , $sample); foreach($keyword as $sample_keyword){ foreach($temp_moto_arr as $id => $nakami){ if(strstr($nakami, $sample_word)){ $temp_last_arr[$sample_keyword][$id] = $nakami; } } } //結果を表示してみる var_dump($temp_last_arr); などで、元のデータに対し何を探してるのか、配列をどのように管理するのか整理してみてはいかがでしょう? あと、単純にワードが存在するかどうかを判定するなら、正規表現を使うよりstrstrの方が早く動作します。 検証してません。構文間違いあったら失敬!

hukazuo
質問者

お礼

ありがとうございました。 回答を参考に試行錯誤したらできました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 配列の値を集めた1つの文字列として取得するには

    Array ( [0] => a [1] => あ [2] => 123 [3] => 55 ) この配列を "a","あ","123","55" といった1つの文字列として取得したいです。 <?php $list = array("a","あ","123",55); $r = ""; for($i=0; $i<count($list); $i++){ $r .= ',"'.$list[$i].'"'; } $r = substr($r,1); echo $r; ?> このような形でできましたが、もっと良い方法はありますか? そして上の方法で良い場合は、下の1~4のどれが一番適切ですか? [1] for($i=0; $i<count($list); $i++){ $r .= ",\"".$list[$i]."\""; } [2] for($i=0; $i<count($list); $i++){ $r .= ',"'.$list[$i].'"'; } [3] foreach($list as $key => $val){ $r .= ",\"".$val."\""; } [4] foreach($list as $key => $val){ $r .= ',"'.$list[$i].'"'; }

    • 締切済み
    • PHP
  • 繰り返し処理が上手くいかない

    foreach($ARR_SCATTER as $val){ //人数分繰り返す //値を分解 $EXPLODE_VALUE = explode(",", $val); //質問1の値を配列に $QUESTION_NO[1][] = $EXPLODE_NUM[0]; //質問2の値を配列に $QUESTION_NO[2][] = $EXPLODE_NUM[1]; //質問3の値を配列に $QUESTION_NO[3][] = $EXPLODE_NUM[2]; //質問4の値を配列に $QUESTION_NO[4][] = $EXPLODE_NUM[3]; //質問5の値を配列に $QUESTION_NO[5][] = $EXPLODE_NUM[4]; //最後の質問の値を配列に $LAST_QUESTION[] = $EXPLODE_NUM[5]; $TOTAL[1] = $QUESTION_NO[1] + $LAST_QUESTION; $TOTAL[2] = $QUESTION_NO[2] + $LAST_QUESTION; $TOTAL[3] = $QUESTION_NO[3] + $LAST_QUESTION; $TOTAL[4] = $QUESTION_NO[4] + $LAST_QUESTION; $TOTAL[5] = $QUESTION_NO[5] + $LAST_QUESTION; } という処理を繰り返し処理をつかって記述したいのですが、うまくいきません。 下記のように記述しましたが、なぜか配列に値が1つしかはいりません。 (質問数は変動、言語はPHP5) foreach($ARR_SCATTER as $val){ //人数分繰り返す //値を分解 $EXPLODE_NUM = explode(",", $val); } for($test =0; $test <= $for_arr_count; $test++){ //質問の値を配列に $QUESTION_NO[$test][] .= $EXPLODE_RADIO_NUM[$test]; //最後の質問の値を配列に $LAST_QUESTION[] = $EXPLODE_RADIO_NUM[5]; $TOTAL[] = $QUESTION_NO[$test] + $LAST_QUESTION; $test++; } 原因がわからず困っています。 アドバイスお願いいたします。

    • ベストアンサー
    • PHP
  • 配列の要素の値をループ中に変更して確認したいのですが、下記やり方では、

    配列の要素の値をループ中に変更して確認したいのですが、下記やり方では、なぜダメなのでしょうか? $arr = array("値1", "キー1" => "値2", "値3"); foreach($arr as $key => $val){ $arr[$key] = "-{$val}-"; echo $val."<br />"; } foreach($arr as $key => $val){ echo "<br />".$val; } 上のforeachの結果が、下と同じようになると期待したのですが、うまくいきません。 なんで、上のforeachと下のforeachの結果が異なるのでしょうか? foreach文で要素の値が更新されるのは、foreach文が終了した瞬間なのでしょうか。 それとも、値はすぐに更新されているけれども、foreach文の処理(順番に抽出する作業?)は既にスタートしてしまっているので、ループ中に更新されても、途中で反映することはできない、ということなのでしょうか? さっぱり分からないので、誰か教えてください。 「配列の要素の値をループ中に変更して確認したい」というよりは、 「なんで、二つのforeach文で結果が異なるか知りたい」です。

    • ベストアンサー
    • PHP
  • 配列データをキーワード検索

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

    mysqlからデータをphpで取得し以下のような多次元配列になっています。 Array ( [0] => Array ( [id] => 116 [name] => あああ ) [1] => Array ( [id] => 58 [name] => いいい ) [2] => Array ( [id] => 89 [name] => ううう ) ) 単純にデータを表示させたく以下のようにしましたが<th>$key2</th>の箇所が上記配列の場合 2回繰り返されて表示されてしまいます。ここはフィールド名なので1回の表示でいいのですが どのように記述すれば思うような表示になるでしょうか? echo "<table border=\"1\">"; echo "<tr>"; foreach ($tmp1 as $key => $val) { foreach ($val as $key2 => $val2) { echo "<th>" . $key2 . "</th>"; //フィールド名 } } echo "</tr>"; foreach ($tmp1 as $key => $val) { echo "<tr>"; foreach ($val as $key2 => $val2) { echo "<td>" . $val2 . "</td>"; // 取得したデータをある分だけ繰り返し } echo "</tr>"; } echo "</table>";

    • ベストアンサー
    • PHP
  • if文の繰り返し・・・?

    $cnt = 0; foreach($sample as $val){ list($id,$date,$comment ,$comment1,$comment2) = split("\t",$val); $cnt++; $date = split("/",$date); if (ereg($date[$cnt0], $val)) { $sample .=<<<EOM <tr></td>$id</td><td>$comment</td><td>$comment1</td></tr> EOM; } echo <<<EOM <table> $sample </table> EOM; として、配列の中からdate[$cnt]に一致したものをすべて出したいのですが、上記のようにすると、 最初に一致したものしか排出されません。 date[0]と一致するものを探すため$sampleを上から流れて、 一致したところからdate[1]を探すようになってしまってるからだと思うのですが、、、、。 これをdate[0]と一致するものが見つかった場合、 一番上から再びdate[1]を検索するといった感じにしたいのですが、 この場合どうしたらよいのでしょうか。

    • ベストアンサー
    • PHP
  • checkbokとキーワード検索を組み合わせた検索

    PHP4とMySQL4.0.22を使っています。 チェックボックスとキーワードで検索結果を表示させたいと思い。 下記のようにプログラムを作成したのですが、うまく検索表示してくれません。 PHPもMySQLも初心者なため、あちこちの構文を寄せ集めたため、Parseもうまく通っていません。 どこをどういう風にすればうまくいくのか、教えていただけないでしょうか? よろしくお願いします。 ----------------------------以下PHPファイル----------- 検索フォーム 検索キーワード:<input type=text name=\"k\"value='$k' size=45 > チェックボックス <INPUT TYPE=\"CHECKBOX\" NAME=\"bumon[]\" value=\"01:河川・砂防及び海岸\">01:河川・砂防及び海岸 ・・ "; //データ検索結果の実行部分 if($sig=="kb"){ $wk ==""; if($wk<>""){ //チェックボックス $sql = "select * from tecris where"; $sql .= " ("; $i=0; foreach($_POST['bumon'] as $fr) { if ($i) { $sql .= " or "; } $sql .= "bumon = '$fr'; $i++; } $sql .= ") and "; //キーワード if($k<>""){ $xk = str_replace(" "," ",$k); $gk = explode(" ",$xk); $wk ="keyword like '%$gk[0]%'"; $i = 1; $n = count($gk) - 1; while ($i <= $n){ $wk = $wk . " and keyword like '%$gk[$i]%'"; $i++; } } //クエリの作成 $sql = $sql . $wk; };

    • 締切済み
    • PHP
  • array_randで要素が数字の場合の処理方法

    PHPのarray_randについて教えて下さい。 下記のようなソースを作りましたが思った通りの結果になりません。 //(A) $test=array(3,5,8,11,14,24,26,28); print_r($test); foreach ($test as $val) { echo $val.'<br>'; } //(B) $keys = array_rand($test, 5);//決められた数を抽出 print_r($keys).'<br><br>'; foreach ($keys as $val) { echo $val.'<br>'; } Aの部分の結果は Array ( [0] => 3 [1] => 5 [2] => 8 [3] => 11 [4] => 14 [5] => 24 [6] => 26 [7] => 28 ) foreachの部分の出力↓ 3 5 8 11 14 24 26 28 となりこれは特に問題ありません。 Bの部分でAの配列から5つランダムで取り出したいのですが、結果は Array ( [0] => 0 [1] => 3 [2] => 5 [3] => 6 [4] => 7 ) 0 foreachの部分の出力↓ 0 3 5 6 7 となってしまい、Aの配列の添え字の中から5つの数字が選ばれるようになってしまいます。 Aの添え字ではなく「3,5,8,11,14,24,26,28」の数字から5つランダムで取り出すにはどのような書き方をすればよいのでしょうか? ご回答よろしくお願い致します。

    • ベストアンサー
    • PHP
  • キーワード検索ほ作成したけど実行するとできないのは何故!?

    <SCRIPT LANGUAGE="PHP"> // 検索用関数 Function Search_Pattern($record,$pattern) { for($loop = 0;$loop < count($pattern);$loop++) { if($pattern[$loop] == "") continue; if(!ereg($pattern[$loop],$record)) return 0; } return 1; } // メインプログラム if($search) { if(!$keyword) { $error = "キーワードが入力されていません"; $search = ""; } } if($search) { $fp = @fopen("search_csv.csv","r"); if(!$fp) { $error = "該当ファイルを参照できません"; $search = ""; } } </SCRIPT> <HTML> <HEAD> <META Http-Equiv="Content-Type" Content="text/html;charset=SHIFT-JIS"> <TITLE>ファイル簡易検索</TITLE> </HEAD> <BODY> <B>ファイル簡易検索</B> <BR> <CENTER> <FORM ACTION="search_csv.php" METHOD="post"> <INPUT TYPE="hidden" NAME="search" VALUE="検索する"> キーワード: <INPUT TYPE="text" NAME="keyword" VALUE="<? echo $keyword; ?>" SIZE="30"> <INPUT TYPE="submit" NAME="search" VALUE="検索する"> </FORM> <FONT COLOR="#FF0000"><? echo $error; ?></FONT> <HR> <P> <SCRIPT LANGUAGE="PHP"> if($search) { echo "<TABLE BORDER=1>\n"; while(!feof($fp)) { $buff = fgets($fp,255); $title .= $buff; if(ereg("\n",$buff)) break; } $title = ereg_replace("\x0A","",$title); $column = split(",",$title); echo "<TR>\n"; for($loop = 0;$loop < count($column);$loop++) { echo '<TD BGCOLOR="#00FFFF" NOWRAP>',$column[$loop],"</TD>\n"; } echo '<TD BGCOLOR="#00FFFF" NOWRAP>'; echo '詳細'; echo "</TD>\n"; echo "</TR>\n"; $keyword = ereg_replace(" "," ",$keyword); $pattern = split(" ",$keyword); while(1) { $line = ""; while(!feof($fp)) { $buff = fgets($fp,255); $line .= $buff; if(ereg("\n",$buff)) break; } if($line == "") break; if(!Search_Pattern($line,$pattern)) continue; $line = ereg_replace("\x0A","",$line); $column = split(",",$line); echo "<TR>\n"; echo "<FORM method=\"post\" action=\"./formdb_modify.php\">\n"; echo "<INPUT type=\"hidden\" name=\"data_no\" value=\"".$column[0]."\">\n"; for($loop =0; $loop< count($column);$loop++) { echo "<TD nowrap><FONT size=-1>" . $column[$loop] . "</FONT></TD>\n"; //echo "<TD nowrap><FONT size=-1>" . $column[1] . "</FONT></TD>\n"; //echo "<TD nowrap><FONT size=-1>" . $column[2] . "</FONT></TD>\n"; //echo "<TD nowrap><FONT size=-1>" . $column[3] . "</FONT></TD>\n"; } echo "<TD nowrap><INPUT type=\"submit\" value=\" 詳細\"></TD>\n"; echo "</FORM>\n"; echo "</TR>\n"; } fclose($fp); echo "</TABLE>\n"; } else { echo "キーワードを入力し、検索ボタンを押すと検索結果がここに表示されます。\n"; } </SCRIPT> 実行すると何も検索されないのだけど... localhostでは、実行されます。 どこがおかしいのでしょうか!?

    • 締切済み
    • PHP
  • foreachのなかで次のキーを参照するには

    こんばんわ, 現在PHPを学習しています。 たとえば, $hoge[0]=1; $hoge[1]=2; $hoge[2]=3; $hoge[3]=4; $hoge[4]=5; $hoge[5]=6; $hoge[6]=7; と配列があり,これをforeachで回していく際に,hogeが5になったときには,次の配列の要素である6を参照したい場合に foreach($hoge as $val){ if($val == 5){ /* $valの次の要素を見たい */ } else{ echo $val; } } をどのようにすれば,よろしいでしょうか。foreach文ではだめなのでしょうか。 nextやeachをしようしようとおもったのですが,うまくいきません。 よろしくお願いします。

    • ベストアンサー
    • PHP