- ベストアンサー
array_intersectで空欄を比較しない方法
- 配列の共通する値を取得するためにarray_intersectを使用します。
- 追加の配列も比較する場合は、配列の要素をif文で追加してからarray_intersectを使用します。
- 追加の配列が存在しない場合は、追加のif文を省略してarray_intersectを使用します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>> 上記に更に値があるか分からない配列($arr3,$arr4)を比較したいときどのように記述すればよいでしょうか? 「値があるか分からない」というのはどういう状況でしょうか? 変数が定義されていない → E_NOTICEを発生させないようにissetでチェックすべきです。NULLとの比較は不適切です。…というよりも、そもそも「定義されていない」という状況に陥るようなコーディングが不適切と言えるかもしれません。 関連: http://qiita.com/mpyw/items/2f9955db1c02eeef43ea 空配列として存在している → isset($var) としていた代わりに !$var とすれば空判定が出来ます。 >> $array_list = implode(",",$array_list); >> と半ば強引に配列に追加したのですが、var_dump($array_list)したところ、 >> Array,Arrayとなってしまいました。 配列から文字列への変換をすれば「Array」になるのは当然です。更にPHP5.4以降であればここでもE_NOTICEが発生しているはずであり、平然とエラーを起こすコードを書いていることになりますね… というかこれってimplodeじゃなくてarray_intersectをやろうとしたんじゃないんですかね? >> 4パターンを書くこともできるかと思いますがスマートではないような気がしまして・・・。 書くとすればこんな感じでしょうか。そもそも「$arr1」「$arr2」のように、配列を使わずに連番の変数を使っている時点でスマートではない気がしますが… $array_list[] = $arr1; $array_list[] = $arr2; if (isset($arr3)) {$array_list[] = $arr3;} if (isset($arr4)) {$array_list[] = $arr4;} $intersects = call_user_func_array('array_intersects', $array_list); 但し、$array_listに2つ以上の配列が入っていないとE_WARNINGが発生して失敗するので注意してください。
その他の回答 (4)
`wp_postmeta`.meta_key = 'area' AND `wp_postmeta`.meta_value = '1' AND `wp_postmeta`.meta_key = 'category' AND `wp_postmeta`.meta_value = '1' ↓ `wp_postmeta`.meta_key = 'area' AND `wp_postmeta`.meta_value = '1' OR `wp_postmeta`.meta_key = 'category' AND `wp_postmeta`.meta_value = '1'
>> 検索機能で今回のようなAという条件に該当する記事をすべて配列で取り出し、同じようにBという条件に該当する記事を全て取り出し、A・B共通部分が絞り込まれた検索結果がAND検索の結果となるというこの検索方法は正しいのでしょうか? いや、めちゃくちゃ効率が悪い方法ですね。PHPは基本的に動作が遅く、SQLで検索を行ったほうが圧倒的に高速です。WordPressを使っているのであればデータベースとしてMySQLを使用しているはずで、もちろんこれはAND検索を行うことが出来ます。 …とはいってもWordPressの膨大なソースコードを読みながら実装していくのもだるいと思うので、既存のプラグインでAND検索が出来るようなものを探したほうがいい気がしますね。
ああなるほど、$_GETや$_POSTの話だったんですね。それだったら納得です。issetでのチェックを行ったうえでarray_intersectにかけてください。 #よりエラーを防げるように丁寧に書くならば型チェックもやったほうがいいですが
補足
大変ご丁寧なアドバイスありがとう御座いました。 無事問題が解決しました。 最後に一つお聞きしたいのですが、 検索機能で今回のようなAという条件に該当する記事をすべて配列で取り出し、同じようにBという条件に該当する記事を全て取り出し、A・B共通部分が絞り込まれた検索結果がAND検索の結果となるというこの検索方法は正しいのでしょうか? 今後もし検索対象が1,000、10,000件となった場合、レスポンスが大幅に悪くなるのでは…と思ったのですがいかがでしょうか? よろしくお願いいたします。
array_intersect "s" で1ヵ所誤字ってたので直してください
補足
早速のご回答ありがとう御座いました。 一度動作を確認してみます。 WordPressで複数の項目を検索できるようカスタマイズしており、 A項目についての検索に該当する記事ID⇒配列A B項目についての検索に該当する記事ID⇒配列B … 最後にarray_intersectですべての条件に該当する記事IDのみ取得(=AND検索) としたのですが、項目AやBが確実に選択されるものではないためこのような形になってしまいました・・・。
お礼
度々のご回答ありがとう御座います。 やはりそうだったのですね…((T_T))。 SQLで表結合をして検索したらすごく高速で今もう一度検索機能を作りなおそうか迷っています…。 【wp_postmeta】 post_id meta_key meta_value -------------------------------------------- 1 area 1 1 category 1 現在wp_postmeta内にカスタムフィールドの「フィールド名(meta_key)」と「その値(meta_value)」が保存されており、「area」が「1」の投稿IDを取得する場合、 SELECT DISTINCT `wp_posts`.ID FROM `wp_posts` LEFT JOIN `wp_postmeta` ON `wp_posts`.ID = `wp_postmeta`.post_id WHERE `wp_postmeta`.meta_key = 'area' AND `wp_postmeta`.meta_value = '1' これで問題なくIDが取れるのですが、更に「category=1」などのAND検索が必要となった場合、 ~WHERE `wp_postmeta`.meta_key = 'area' AND `wp_postmeta`.meta_value = '1' AND `wp_postmeta`.meta_key = 'category' AND `wp_postmeta`.meta_value = '1' という記述では当然ながら0件でヒットしませんでした。 このような場合、何か良い検索方法はありますでしょうか? 何からなにまで質問づくしで申し訳御座いません(/_;)