
お世話になります。
$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で質問しましょう!
似たような質問が見つかりました
- JavaScript java keyを配列で表記したい 10 2022/12/01 17:53
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- PHP ファイルの書き込みについて教えて下さい。 1 2023/03/20 12:01
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- Visual Basic(VBA) 型が一致しませんとエラー 6 2023/07/06 20:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語の配列をPush(追加)する...
-
PHP初心者の質問object(stdClass)
-
文字列の並び替え
-
Eclipseコンテンツアシストでプ...
-
文字列の取得について
-
連想配列に追加ってできるン?
-
かなでの並び替え
-
特定の文からメールアドレスの...
-
PHPは何故値渡しより参照渡しの...
-
php foreach 配列のソート方法
-
数独かを判断するプログラム
-
C++ VS2005におけるイテレータ...
-
配列の複数の値のデータベース...
-
一致しないデータも表示させたい
-
phpの質問です
-
String だと「 ByRef引数の型が...
-
$_SESSIONに二次元配列を使える...
-
CSV読込(fgetcsv関数)で「手...
-
C#のキャスト?
-
$_POSTを一括してサニタイズし...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語の配列をPush(追加)する...
-
行列
-
CArrayの要素としてCStringArra...
-
Texでの数式
-
読み(あ行~わ行)ごとに分け...
-
CArrayのソート
-
C言語 最大値と最小値を求めて...
-
fgetc関数について
-
PHPのmin関数、「1」以上の数値...
-
連想配列の文字コードを変換
-
STLのvectorで作った配列をメン...
-
C言語のchar ポインタ
-
C言語で全角文字の扱いについて
-
配列を指定した順序でソート
-
php で1から100までの素数の表...
-
delphi 2次元配列がわかりません
-
np.stack()とnp.array()の違い
-
array_intersectで空欄を比較し...
-
cakephpでのトランザクション処...
-
verilogで、配列の一部をタスク...
おすすめ情報