• 締切済み

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

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

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

みんなの回答

  • 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

  • 配列データを置き換える

    こんにちは。お世話になっております。 タイトルにあるように、配列のことでお伺いしたいのですが、 既に存在する配列($array1)と、ポストされた配列($array2)があるとします。 $array1=array("佐藤","田中","鈴木","吉田","加藤","岡田"); $array2=array("佐藤","佐々木","鈴木","吉田","岡田","加藤"); そこで、元の配列をポストされた配列に置き換えるようなものを作りたいのですが(実際は置き換えるというより、配列内を修正という感覚で行っています)、for文を用い配列内のデータ数を繰り返し処理を行いながら、array_splice()などを使いながら、ポストされたデータから元の配列と一致していれば、そのまま新規配列にセット。一致しなければ、ポストされたデータをセット。という具合に行うべきか?と、ソースを記述している段階なのですが、もっと効率のよい方法はないものか?と思い、皆さまにアドバイスいただきたく投函させて頂きました。 上手く説明できずに申し訳ありませんが、ご指導頂戴出来れば幸いです。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 配列検索

    配列中に、特定の文字が無いか確認したいので、 これを使ってみてます。 in_array('abc', $a); でも、これは 「abc」という文字と完全一致しないとダメですよね。 「a」を含むという検索は出来ませんか?

    • 締切済み
    • PHP
  • 配列の中に重複文字列があるか否かをチェックしたいのですが、アルゴリズムを教えてください。

    配列10000個の中に次のように文字列が入っているとします。 (実際に使うのはもっとずっと長い文字列が配列内に格納されています。) Data_Array[1] = "GRZRMZCOMKMSG" Data_Array[2] = "DCUIROTLUMWBC" Data_Array[3] = "RGLBMILRPBSMY" . . . Data_Array[9998] = "RSKFDHAHMOESI" Data_Array[9999] = "AQVOXBVNILGOP" Data_Array[10000] = "YNYRUPEXYOGFN" 配列Data_Array[10000]の中に重複文字列がないか探索したいと考えています。 ~普段の手順~ 配列中身を一度テキストに吐き出し、そのテキストをExcelに貼り付ける。 そして、Excelのフィルタ機能で重複文字列を排除。 その後、重複文字列を排除した文字列を保存したものをテキストファイルに保存する。 それをプログラムで読み込んで配列内に格納してから次の処理を続ける といった、効率の悪い方法をとっています。 そこで、プログラム内で処理する方法を次のように考えてみました。 ~思いつく方法~ dim DataArrayTemp[10000] for i = 1 to 10000 flag = 0 // 重複文字がないかチェック for j = i+1 to 10000 ifb Data_Array[i] = Data_Array[j] then // 重複があった場合はflag = 1にする flag = 1 break // 内ループ脱出 endif next // flag = 0であれば重複がない項目 (flag = 1のときは、重複がある) ifb flag = 0 then DataArrayTemp[temp_i] = Data_Array[i] temp_i = temp_i + 1 endif next これは、力技なので配列内の量が多くなると計算時間がかかってしまいます。 ですので、重複しない文字列だけを抽出する効率の良い方法がありましたらどなたか知恵を貸してください。

  • PHPでfile()を使った際の配列の要素について

    PHPのfile関数の動作について質問させて頂きます。 テキストファイルからfile()を使って配列に各行のデータを取り込んだのですが、その配列から特定の要素を探そうとしたところ、検出できませんでした。 テキスト.txtの内容------- AAA BBB CCC --------------- $array = file("テキスト.txt"); $word = "AAA"; $keys = array_keys($array,$word); var_dump($keys); 簡略化しましたが、こんな感じで実行するとAAAが格納されているはずの[0]番目のkeyは検出されません。 bar_dumpを使って$array[0]と$wordを確認してみたところ、以下のようなデータが帰ってきました。 $array[0] → string(5) "AAA" $word → string(3) "AAA" まったく同じ文字列なのに、配列の方の長さが2ほど大きくなっています。 そこでtrimを使用してみたところ、配列からこの謎の2バイト?のデータが削除できました。 検索も正しく動作するようになりました。 文末に改行が入ってるのかとも思ったのですが、\nを削除する処理では検索が出来なかったので、不思議に思っております。 テキストファイルから取り込んだ際に、文字列の前か後ろに何らかの文字が入っているのだと思うのですが、実際どのような文字が入っているのでしょうか? ---------------------------------- それともう一つお聞きしたいのですが、 テキストファイル内容がある程度長い(100行以上、または1万文字以上など)場合、file()で配列にデータを取り込むのは負荷が大きかったりするのでしょうか? fgetsで1行ずつ取り出して比較する方法も考えたのですが、処理の繰り返しと取り込むデータの大きさのどちらに配慮するべきか悩んでいます。 もし100行や1万文字が多い・少ないという感覚になる場合、実際「配列にするには大きすぎる」という感覚はどれくらいの容量から考えるべきでしょうか? 後半の質問につきましては明確な答えで無くても、「自分はこう感じる」というような感覚的なご意見でもお聞きしたいと思っています。 お手数をおかけしますが、どうぞよろしくお願い致します。

    • ベストアンサー
    • PHP
  • 配列をmb_ereg_replaceで一気に置き換えるには?

    お世話になります。 mb_ereg_replace関数を使い文字の置き換えを行っているのですが、置き換 えるものが多く、1回で置き換えられないかと思い、質問をさせて頂き ます。 // 検索文配列 $search = array("__tome__", "__hame__", "__hoge__"); // 置き換え文配列 $replace = array("$tome", "$hame", "$__hoge__"); // 置き換え $str = mb_ereg_replace($search, $replace, $str1); とやると Warning: mb_ereg_replace() expects parameter 2 to be string, array given in on line というエラーが出てしまい、うまく置き換える事が出来ません。どのようにすればうまく置き換えられるでしょうか? ご教授のほどよろしくお願いします。

    • ベストアンサー
    • PHP
  • データの配列

    POSTで送られたデータから配列を作りたいのです。 下記はPOSTのデータをprint_r($_POST)で全て表示していますが、 この中から[NO0~11]までを array([0]=>11 [1]=>6 ~)というような形で配列として表示したので すが、方法が分かりません。 Array ( [N00] => 11 [NAME0] => a [N01] => 6 [NAME1] => b [N02] => 9 [NAME2] => c [N03] => 3 [NAME3] => d [N04] => 12 [NAME4] => e [N05] => 10 [NAME5] => f [N06] => 1 [NAME6] => g [N07] => 5 [NAME7] => h [N08] => 2 [NAME8] => i [N09] => 7 [NAME9] => j [N010] => 4 [NAME10] => k [N011] => 8 [NAME11] => l)

    • 締切済み
    • PHP
  • 配列の中に一部の文字があるかどか確認したい。

    <? header("Content-Type: text/html; charset=EUC"); $sample = array('test1' => "aaa 000 222 333" ,'test2' => "b 555 888 999",'test3' => "c 777 111 10"); if(in_array("222",$sample)){ echo "●"; } if(in_array("aaa 000 222 333",$sample)){ echo "○"; } ?> というようにPHPを記述すると「○」はでるのですが、 「●」がでません。 eregのように配列の中に一部の文字があるかどうかを確認する場合はどうしたらよいのでしょうか。

    • 締切済み
    • PHP
  • AWKの配列内データの処理について

    AWKを使用して入力ファイルの1行内の単語に対して条件チェックするには for( i=1 ; i<= NF i++ ){    if( $I == chek_word )       処理 } とすればできるのはわかるのですが、 一旦、配列の中に格納した文字列に対して上記の処理と同様の処理をするにはどのようにすればいいのでしょうか? 例えば data_line[$1] = $0; として配列data_lineに格納した1行そのままのデータに対して1番上の行全体にわたる単語の条件チェック をおこないたいのですが、どのようにすればいいのかよくわかりません。 どなたかご存知の方アドバイスをお願いします。

  • 配列をWHEREで検索できますか。

    こんにちは。私はMysql4.1,PHP5を使用しています。 いまチェックボックスを使った配列の検索で悩んでおりました。 <input type="checkbox" name="chiiki[]" value="1">北海道 <input type="checkbox" name="chiiki[]" value="2">青森県 という形でhtmlからPOSTで値を受けとり検索したいと考えています。 テーブルには ---------------- chiiki ---------------- 1,2,4 というように配列で登録しています。 http://oshiete.nikkeibp.co.jp/kotaeru.php3?q=1496449 を参考にさせていただいたのですが、結果がうけとれません。 今まで配列を処理するときは while($col = mysql_fetch_array($rst)){ $chiiki = split(",",$col['chiiki']); } としていましたが、これは結果の値を受け取ったあとなので whereを使って配列と一致させる方法がわかりません。 どなたかご教授いただけないでしょうか。よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 二次元配列の参照とデータ取得について

    いつもお世話になっております。 C言語で以下のようなことをしたいのですが可能でしょうか。 <二次元配列のデータ> [AA,11][BB,22][CC,33] ・検索文字列⇒"BB" 上記検索文字列"BB"が二次元配列データの左側(AA,BB,CCなど)と 照合されて一致した場合、その照合した配列の右側(11,22,33)を アウトプットとして返すようにしたいのですが実現可能でしょうか。