質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

1回答

4139閲覧

PHPと楽天APIを使って、2つの商品の最安値ランキングから、ショップが重複するものをさらにランキングに

miyaya

総合スコア8

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2016/08/21 10:22

###前提・実現したいこと
PHPの勉強で、楽天APIを引っ張って、最安値ランキングを作っています。
商品ごとのランキングはできたんですが、
次に作りたいのが、2つ商品のランキングを比較し、
両者で重複するショップを取得し、
2つの商品の金額を足して、安い順に並び直したいと思っています。

例:「2種類の猫のフードを、両方売っているショップで、なおかつ最安値で買いたい」

※下記のソースコードには、楽天APIのapplicationIdが入っていないので、
そのままでは動かないことをご了承下さい。

###2つの商品を選択するHTMLソースコード

HTML

1<form action="kotae.php" name="form1" method="post"> 2 <select name="food1"> 3 <option value="センシブル,4kg">センシブル 4kg</option> 4 <option value="センシブル,2kg">センシブル 2kg</option> 5 </select> 6 7 <select name="food2"> 8 <option value="メールケア,4kg">メールケア 4kg</option> 9 <option value="メールケア,2kg">メールケア 2kg</option> 10 </select> 11 12 <input type="submit" value="計算する"></p> 13</form>

###ボタンを押した先「kotae.php」のソースコード

PHP

1<?php 2$food1 = $_POST['food1']; //1つ目のselectのoptionのvalue 3$food2 = $_POST['food2']; //2つ目のselectのoptionのvalue 4 5//カンマで分けて配列にする 6$food1 = explode(',',$food1); 7$food2 = explode(',',$food2); 8 9//NGキーワード(他のグラム数の商品が混ざらないように) 10if( $food1[1] == '4kg' ){ 11 $NGkeyword = '0.2kg 0.4kg 400g 2kg'; 12} elseif( $food1[1] == '2kg' ){ 13 $NGkeyword = '0.2kg 0.4kg 400g 4kg'; 14} elseif( $food1[1] == '400g' ){ 15 $NGkeyword = '0.2kg 2kg 4kg'; 16}elseif( $food1[1] == '200g' ){ 17 $NGkeyword = '400g 0.4kg 2kg 4kg'; 18} 19 20//エンコード 21$NGkeyword = mb_convert_encoding($NGkeyword,'UTF-8','auto'); 22$NGkeyword = urlencode($NGkeyword); 23 24 //1個目の商品エンコード 25$food1_en1 = mb_convert_encoding($food1[0],'UTF-8','auto'); 26$food1_en2 = mb_convert_encoding($food1[1],'UTF-8','auto'); 27$food1_en1 = urlencode($food1_en1); 28$food1_en2 = urlencode($food1_en2); 29 30 //2個目の商品エンコード 31$food2_en1 = mb_convert_encoding($food2[0],'UTF-8','auto'); 32$food2_en2 = mb_convert_encoding($food2[1],'UTF-8','auto'); 33$food2_en1 = urlencode($food2_en1); 34$food2_en2 = urlencode($food2_en2); 35 36 37 38//1個目の商品のAPIのURL作る(キーワードとNGワードを入れる) 39$url1 = 'https://app.rakuten.co.jp/services/api/IchibaItem/Search/20140222?format=xml&keyword='.$food1_en1.'%20'.$food1_en2.'&NGKeyword='.$NGkeyword.'&genreId=112115&sort=%2BitemPrice&availability=1&applicationId=*****'; 40 41$xml1 = simplexml_load_string(file_get_contents("$url1")); 42 43 44//2個目の商品のAPIのURL作る(キーワードとNGワードを入れる) 45$url1 = 'https://app.rakuten.co.jp/services/api/IchibaItem/Search/20140222?format=xml&keyword='.$food2_en1.'%20'.$food2_en2.'&NGKeyword='.$NGkeyword.'&genreId=112115&sort=%2BitemPrice&availability=1&applicationId=*****'; 46 47$xml2 = simplexml_load_string(file_get_contents("$url2")); 48 49//1個目の商品をforeachでまわす 50foreach((object) $xml1->Items->Item as $item){ 51 52 $name = $item -> itemName;//商品名 53 54 if (strpos($name, $food1[0]) !== FALSE){ 55 56 //繰り返し回数による判定 57 if ( $i >= 10){ 58 break; //10に達したら終了 59 } else { 60 $i++; //繰り返された回数を1つずつカウント 61 $catchcopy = $item -> catchcopy;//キャッチコピー 62 $itemurl = $item -> affiliateUrl;//リンクURL 63 $imageUrl = $item -> mediumImageUrls -> imageUrl;//画像 64 $imageUrl_min = $item -> smallImageUrls -> imageUrl;//小さい画像 65 $shopName = $item -> shopName;//ショップネーム 66 $itemPrice =$item -> itemPrice; 67 $itemPrice = number_format(intval($itemPrice));//金額 68 $shopUrl = $item -> shopUrl;//ショップURL 69 70 //比較するために配列に入れなおそうとしましたが、このままだと上書きされるだけ… 71 $array_food1 = array($shopName,$catchcopy,$itemurl,$imageUrl,$imageUrl_min,$itemPrice,$itemPrice,shopUrl,$itemPrice); 72 } 73 } 74} 75 76//2個目の商品をforeachでまわす 77foreach((object) $xml2->Items->Item as $item){ 78 79 $name = $item -> itemName;//商品名 80 81 if (strpos($name, $food2[0]) !== FALSE){ 82 83 //繰り返し回数による判定 84 if ( $i >= 10){ 85 break; //10に達したら終了 86 } else { 87 $i++; //繰り返された回数を1つずつカウント 88 $catchcopy = $item -> catchcopy;//キャッチコピー 89 $itemurl = $item -> affiliateUrl;//リンクURL 90 $imageUrl = $item -> mediumImageUrls -> imageUrl;//画像 91 $imageUrl_min = $item -> smallImageUrls -> imageUrl;//小さい画像 92 $shopName = $item -> shopName;//ショップネーム 93 $itemPrice =$item -> itemPrice; 94 $itemPrice = number_format(intval($itemPrice));//金額 95 $shopUrl = $item -> shopUrl;//ショップURL 96 97 98 //比較するために配列に入れなおそうとしましたが、このままだと上書きされるだけ… 99 $array_food2 = array($shopName,$catchcopy,$itemurl,$imageUrl,$imageUrl_min,$itemPrice,$itemPrice,shopUrl,$itemPrice); 100 } 101 } 102} 103 104//配列比較 105//var_dump($array_food2); 106//var_dump( array_intersect_assoc($array_food1, $array_food2) ); 107

そもそも、配列の中身を比較して、同じショップのものを取り出す、
というのが出来るのかどうかも分からない状態で進めてきています。
でも、この機能は欲しいな〜と思っている次第です!

情報不足、言葉足らずでしたら、追記致しますので、
どうぞよろしくお願いいたします!

###補足情報(言語/FW/ツール等のバージョンなど)
PHP:5.4.10

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

検索結果をショップ名をキーにした連想配列に格納してはどうでしょうか。
サンプルを作ってみましたので参考にしてみてください。

PHP

1// 検索結果をショップ名をキーにした連想配列に詰める 2$result["shop-a"][] = array("item"=>"猫缶A","price"=>100,"url"=>"http://..."); 3$result["shop-a"][] = array("item"=>"猫缶B","price"=>150,"url"=>"http://..."); 4$result["shop-b"][] = array("item"=>"猫缶A","price"=>105,"url"=>"http://..."); 5$result["shop-c"][] = array("item"=>"猫缶A","price"=>98,"url"=>"http://..."); 6$result["shop-c"][] = array("item"=>"猫缶B","price"=>110,"url"=>"http://..."); 7 8// 結果が2件以上のショップだけを抽出する 9$result2 = array_filter($result, function($r){ 10 return count($r)>=2; 11}); 12 13// 商品の合計の小さい順に並び替え 14uasort($result2,function($r1,$r2){ 15 return array_sum(array_column($r1,"price")) > array_sum(array_column($r2,"price")); 16}); 17 18var_dump($result2);

結果

array(2) { ["shop-c"]=> array(2) { [0]=> array(3) { ["item"]=> string(7) "猫缶A" ["price"]=> int(98) ["url"]=> string(10) "http://..." } [1]=> array(3) { ["item"]=> string(7) "猫缶B" ["price"]=> int(110) ["url"]=> string(10) "http://..." } } ["shop-a"]=> array(2) { [0]=> array(3) { ["item"]=> string(7) "猫缶A" ["price"]=> int(100) ["url"]=> string(10) "http://..." } [1]=> array(3) { ["item"]=> string(7) "猫缶B" ["price"]=> int(150) ["url"]=> string(10) "http://..." } } }

追記

PHP

1$food1 = "猫缶"; //$_POST['food1']; //1つ目のselectのoptionのvalue 2$food2 = "カリカリ"; //$_POST['food2']; //2つ目のselectのoptionのvalue 3 4// 検索結果をショップ名をキーにした連想配列に詰める 5$result["shop-a"][$food1][] = array("item"=>"猫缶A","price"=>100,"url"=>"http://..."); 6$result["shop-a"][$food1][] = array("item"=>"猫缶A(関東限定)","price"=>100,"url"=>"http://..."); 7$result["shop-a"][$food2][] = array("item"=>"猫缶B","price"=>150,"url"=>"http://..."); 8$result["shop-b"][$food1][] = array("item"=>"猫缶A","price"=>105,"url"=>"http://..."); 9$result["shop-c"][$food1][] = array("item"=>"猫缶A","price"=>98,"url"=>"http://..."); 10$result["shop-c"][$food2][] = array("item"=>"猫缶B","price"=>110,"url"=>"http://..."); 11 12// food1とfood2の両方の結果があるショップだけを抽出する 13$result2 = array_filter($result, function($r){ 14 return count($r)>=2; 15}); 16 17// 並び替えの処理は、複数商品があった場合どうするかによるので今回は省略 18 19var_dump($result2);

結果

array(2) { ["shop-a"]=> array(2) { ["猫缶"]=> array(2) { [0]=> array(3) { ["item"]=> string(7) "猫缶A" ["price"]=> int(100) ["url"]=> string(10) "http://..." } [1]=> array(3) { ["item"]=> string(21) "猫缶A(関東限定)" ["price"]=> int(100) ["url"]=> string(10) "http://..." } } ["カリカリ"]=> array(1) { [0]=> array(3) { ["item"]=> string(7) "猫缶B" ["price"]=> int(150) ["url"]=> string(10) "http://..." } } } ["shop-c"]=> array(2) { ["猫缶"]=> array(1) { [0]=> array(3) { ["item"]=> string(7) "猫缶A" ["price"]=> int(98) ["url"]=> string(10) "http://..." } } ["カリカリ"]=> array(1) { [0]=> array(3) { ["item"]=> string(7) "猫缶B" ["price"]=> int(110) ["url"]=> string(10) "http://..." } } } }

投稿2016/08/22 01:28

編集2016/08/24 23:57
ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyaya

2016/08/24 10:42

ttyp03さん 丁寧にサンプルソースまで作っていただきありがとうございます! 「ショップ名をキーにして連想配列」というのが出来ることをここで知りました! なんとか「結果が2件以上のショップだけを抽出する」まで出来たのですが、 楽天APIの問題(?)で、 同じショップ名で同じ商品を出していることもあるようなのです。 (例:「猫缶A」と「猫缶A(関東限定価格)」など) そこで、selectタグごとの「food1」「food2」を一緒くたにしないで、 「food1」のショップ名が、「food2」にあるか見ていく、ということは出来ますか? どうぞよろしくお願い致します。
ttyp03

2016/08/24 23:55

どういう風に処理させたいのかイメージがつかめませんが、結果を保持する配列を次のような形にしてはどうでしょうか。 result[ショップ名]  food[food1名]   [0]結果   [1]結果   …  food[food2名]   [0]結果   [1]結果   … こうすれば、ショップごとにfood1と2の結果を別々に管理できます。 サンプルを追記しておきますので参考にしてみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問