- ベストアンサー
配列の比較
下記のような配列が二つあります。 1 $array1 = Array ( [0] => 20 [1] => 22 ) 2 $array2 = Array ( [0] => 20 [1] => 22 [2] => 18 [3] => 19 ) array_intersect関数を使い、 この配列を比較して、重複している値を取り出したいのですが、 どうしてもできません。 $intersect = array_intersect($array1,$array2); print_r($intersect); としましたが、だめです。根本的な構造が違うのか? または他の方法があるのか? ご教授お願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
print_r()で区別がつかないのであれば、var_dump()でより詳しく 見ていってはどうでしょうか? var_dump($array1); var_dump($array2); var_dump($intersect);
その他の回答 (3)
- koke29
- ベストアンサー率58% (114/196)
なんか全然違うこと書いちゃいましたね スミマセン。 $array2はDBから呼び出しているとのことと、 Array ( [0] => 20 [1] => 22 ) Array ( [0] => 20 [1] => 22 [2] => 18 [3] => 19 ) ここまでは表示出来ているとのことなので array_intersect の入れる場所がダメなのでは?と思いました DBデータの展開にはforとかを使っていると思うのですが array_intersectの記述がforの外に出ているとか また外していたらスミマセン。 私がよくこういう間違いをしていたので、もしやと思いまして。
- koke29
- ベストアンサー率58% (114/196)
$array1 = array("20","18","19","22") ; $array2 = array("20","22"); $array3 = array_diff($array1,$array2); print_r($array3); これで Array ( [1] => 18 [2] => 19 ) の値が取れました。 ただ配列のキーが元の配列のままになってしまうのでこれだと更に加工が 必要になるのかもしれませんね。 他にもっといい方法がありそうな感じがしますが、とりあえず。
- yambejp
- ベストアンサー率51% (3827/7415)
>$intersect = array_intersect($array1,$array2); >print_r($intersect); >としましたが、だめです。 <? $array1 = Array(20,22); $array2 = Array (20,22,18,19); $intersect = array_intersect($array1,$array2); print_r($intersect); ?> で、「Array ( [0] => 20 [1] => 22 ) 」が出力されないのでしょうか? その場合、どのような結果が出力されているのでしょうか? それともそれが期待した結果ではないのでしょうか? その場合はどういう結果を期待しているのでしょうか?
お礼
koke29さん、yambejpさん、ありがとうございます。 こちらの表示ではArray()となってしまいます。 詳しく説明すると、$array1は商品登録時にチェックボックスを使い MySQLへsirialize関数を使って格納し、それをunsirializeして表示したものです。$array2はMysqlから主キーfetch_arrayで取り出して、配列にしたものです。 両方ともin_arrayで値が入っているか確認したので、配列になっていると思うのですが、どうしてもarray_intersectで取り出すことができません。そもそもデータベースの格納時点で構造などが違っているのでしょうか? Array ( [0] => 20 [1] => 22 ) Array ( [0] => 20 [1] => 22 [2] => 18 [3] => 19 ) ここまでは表示できたのですが、お手上げ状態です。 すみませんが、ご教授お願いいたします。
お礼
yambejpさん、ありがとうございました。 var_dumpで表示してみた所、下記のようになりました。 文字数が4文字と2文字になっていることが判明しました。 値の前後に半角スペースが入っているようです。 データベースへの登録時に間違いがあるようなので、もう一度確認してみます。恥ずかしながらvar_dumpは初めて使いましたが、詳しく調べるのには最適ですね。 明日もう一度、手直しして結果を報告させていただきます。 ■var_dump($array1); array(2) { [0]=> string(4) " 20 " [1]=> string(4) " 22 " } ■var_dump($array2); array(4) { [0]=> string(2) "20" [1]=> string(2) "22" [2]=> string(2) "18" [3]=> string(2) "19" } ■var_dump($intersect); array(0) { } また、koke29さん、親切なご回答ありがとうございました。 このような事に気をつけなければ!と再確認させていただきました。 一度チェックさせて頂きます。参考になりました。
補足
早速、チェックボックスからデータベースへの登録部分をチェックしてみました。結果、 $op_no .= "<input type='checkbox' name='opno[]' value=' $opno '>$opno$subject<br>"; 上のvalue=' $opno 'の部分に左右に半角スペースが入っていたのを無しにしてみたら ■array(2) { [0]=> string(2) "20" [1]=> string(2) "22" } ■array(4) { [0]=> string(2) "20" [1]=> string(2) "22" [2]=> string(2) "18" [3]=> string(2) "19" } ■array(2) { [0]=> string(2) "20" [1]=> string(2) "22" } となりました。var_dumpを教えて頂かなければ、まったく考えていなかった部分なので気づくことはなかったと思います。今後多用したいと思います。ありがとうございました。一週間も考えていましたが、その間にたくさんのことを勉強できたのが良かったです。 またkoke29さんの回答も大変参考になりました。また次回もよろしくお願いいたします。 本当に助かりました!