アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。

$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パターンを書くこともできるかと思いますがスマートではないような気がしまして・・・。

なにかよい方法が有りましたらよろしくお願い致します。

A 回答 (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が発生して失敗するので注意してください。
    • good
    • 0

`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'
    • good
    • 0

>> 検索機能で今回のようなAという条件に該当する記事をすべて配列で取り出し、同じようにBという条件に該当する記事を全て取り出し、A・B共通部分が絞り込まれた検索結果がAND検索の結果となるというこの検索方法は正しいのでしょうか?



いや、めちゃくちゃ効率が悪い方法ですね。PHPは基本的に動作が遅く、SQLで検索を行ったほうが圧倒的に高速です。WordPressを使っているのであればデータベースとしてMySQLを使用しているはずで、もちろんこれはAND検索を行うことが出来ます。

…とはいってもWordPressの膨大なソースコードを読みながら実装していくのもだるいと思うので、既存のプラグインでAND検索が出来るようなものを探したほうがいい気がしますね。
    • good
    • 0
この回答へのお礼

度々のご回答ありがとう御座います。

やはりそうだったのですね…((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件でヒットしませんでした。

このような場合、何か良い検索方法はありますでしょうか?


何からなにまで質問づくしで申し訳御座いません(/_;)

お礼日時:2014/11/05 11:53

ああなるほど、$_GETや$_POSTの話だったんですね。

それだったら納得です。issetでのチェックを行ったうえでarray_intersectにかけてください。

#よりエラーを防げるように丁寧に書くならば型チェックもやったほうがいいですが

この回答への補足

大変ご丁寧なアドバイスありがとう御座いました。
無事問題が解決しました。

最後に一つお聞きしたいのですが、
検索機能で今回のようなAという条件に該当する記事をすべて配列で取り出し、同じようにBという条件に該当する記事を全て取り出し、A・B共通部分が絞り込まれた検索結果がAND検索の結果となるというこの検索方法は正しいのでしょうか?

今後もし検索対象が1,000、10,000件となった場合、レスポンスが大幅に悪くなるのでは…と思ったのですがいかがでしょうか?

よろしくお願いいたします。

補足日時:2014/11/05 02:20
    • good
    • 0

array_intersect "s"



で1ヵ所誤字ってたので直してください

この回答への補足

早速のご回答ありがとう御座いました。
一度動作を確認してみます。

WordPressで複数の項目を検索できるようカスタマイズしており、

A項目についての検索に該当する記事ID⇒配列A
B項目についての検索に該当する記事ID⇒配列B


最後にarray_intersectですべての条件に該当する記事IDのみ取得(=AND検索)

としたのですが、項目AやBが確実に選択されるものではないためこのような形になってしまいました・・・。

補足日時:2014/11/03 18:47
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!