![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67b6d)
お世話になります。
$arr1 = array(1,2,3);
$arr2 = array(2,3,4);
という配列が存在していたとき、これらすべてに共通する値を取り出すとき、
array_intersect($arr1,$arr2)
で良いと思うのですが、上記に更に値があるか分からない配列($arr3,$arr4)を比較したいときどのように記述すればよいでしょうか?
$array_list[] = $arr1;
$array_list[] = $arr2;
if($arr3 != NULL){$array_list[] = $arr3;}
if($arr4 != NULL){$array_list[] = $arr4;}
$array_list = implode(",",$array_list);
と半ば強引に配列に追加したのですが、var_dump($array_list)したところ、
Array,Arrayとなってしまいました。
$arr3,$arr4に値が入っている場合と入っていない場合でif分岐させて、
array_intersect($arr1,$arr2)
array_intersect($arr1,$arr2,$arr3)
array_intersect($arr1,$arr2,$arr4)
array_intersect($arr1,$arr2,$arr3,$arr4)
の4パターンを書くこともできるかと思いますがスマートではないような気がしまして・・・。
なにかよい方法が有りましたらよろしくお願い致します。
No.1ベストアンサー
- 回答日時:
>> 上記に更に値があるか分からない配列($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が発生して失敗するので注意してください。
No.5
- 回答日時:
`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'
No.4
- 回答日時:
>> 検索機能で今回のようなAという条件に該当する記事をすべて配列で取り出し、同じようにBという条件に該当する記事を全て取り出し、A・B共通部分が絞り込まれた検索結果がAND検索の結果となるというこの検索方法は正しいのでしょうか?
いや、めちゃくちゃ効率が悪い方法ですね。PHPは基本的に動作が遅く、SQLで検索を行ったほうが圧倒的に高速です。WordPressを使っているのであればデータベースとしてMySQLを使用しているはずで、もちろんこれはAND検索を行うことが出来ます。
…とはいってもWordPressの膨大なソースコードを読みながら実装していくのもだるいと思うので、既存のプラグインでAND検索が出来るようなものを探したほうがいい気がしますね。
度々のご回答ありがとう御座います。
やはりそうだったのですね…((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件でヒットしませんでした。
このような場合、何か良い検索方法はありますでしょうか?
何からなにまで質問づくしで申し訳御座いません(/_;)
No.3
- 回答日時:
ああなるほど、$_GETや$_POSTの話だったんですね。
それだったら納得です。issetでのチェックを行ったうえでarray_intersectにかけてください。#よりエラーを防げるように丁寧に書くならば型チェックもやったほうがいいですが
この回答への補足
大変ご丁寧なアドバイスありがとう御座いました。
無事問題が解決しました。
最後に一つお聞きしたいのですが、
検索機能で今回のようなAという条件に該当する記事をすべて配列で取り出し、同じようにBという条件に該当する記事を全て取り出し、A・B共通部分が絞り込まれた検索結果がAND検索の結果となるというこの検索方法は正しいのでしょうか?
今後もし検索対象が1,000、10,000件となった場合、レスポンスが大幅に悪くなるのでは…と思ったのですがいかがでしょうか?
よろしくお願いいたします。
No.2
- 回答日時:
array_intersect "s"
で1ヵ所誤字ってたので直してください
この回答への補足
早速のご回答ありがとう御座いました。
一度動作を確認してみます。
WordPressで複数の項目を検索できるようカスタマイズしており、
A項目についての検索に該当する記事ID⇒配列A
B項目についての検索に該当する記事ID⇒配列B
…
最後にarray_intersectですべての条件に該当する記事IDのみ取得(=AND検索)
としたのですが、項目AやBが確実に選択されるものではないためこのような形になってしまいました・・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
読み(あ行~わ行)ごとに分け...
-
C言語の配列をPush(追加)する...
-
np.stack()とnp.array()の違い
-
行列
-
fgetc関数について
-
特定の文からメールアドレスの...
-
templateを使ったXOR swapのバ...
-
$test = array(80,60,22,50,75)...
-
MySQLのデータをPHPで多次元...
-
2次元配列への標準入力
-
STLのvectorで作った配列をメン...
-
PHPのセレクトボックスの初期値...
-
verilogで、配列の一部をタスク...
-
Smarty 三次元配列を使いたい
-
pythonのnumpyでの繰り返しでの...
-
配列をループでたくさん宣言し...
-
$_SESSIONに二次元配列を使える...
-
foreachのなかで次のキーを参照...
-
PHPのカッコ[ ]の使い方について
-
Resource id #3 と表示されま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列の要素(value)に、変数を...
-
特定の文からメールアドレスの...
-
読み(あ行~わ行)ごとに分け...
-
C言語の配列をPush(追加)する...
-
STLのvectorで作った配列をメン...
-
CArrayの要素としてCStringArra...
-
verilogで、配列の一部をタスク...
-
System.String.Splitでエラー
-
Perlで重複行を削除したい
-
行列
-
C言語 最大値と最小値を求めて...
-
スカラーのベクトル微分
-
PHPで2次元配列を1次元配列に...
-
mallocで char *型の配列を確...
-
array_intersectで空欄を比較し...
-
am()の使い方
-
Pascalの手続きについて
-
ソートの名称について
-
複数のforeachをまとめるには
-
PHPのmin関数、「1」以上の数値...
おすすめ情報