前提・実現したいこと
楽天APIを使い、商品検索して帰ってきた値を取得したいのですが、PHPのjson_decodeで配列化したjsonデータからfor分などの繰り返し処理でデータを取りたいです。
発生している問題
for文で値を取ろうとすると失敗する。エラーコードはなく、一つ目以降出力がされなかった。
公式ドキュメント
https://webservice.rakuten.co.jp/api/ichibaitemsearch/#requestURL
該当のソースコード
PHP
1$json = file_get_contents("https://app.rakuten.co.jp/serv........") 2$arr = json_decode($json, true); 3 4print($arr['Items'][1]['Item']['affiliateUrl'].'<br><br>'); 5print($arr['Items'][2]['Item']['affiliateUrl'].'<br><br>'); 6print($arr['Items'][3]['Item']['affiliateUrl'].'<br><br>'); 7print($arr['Items'][4]['Item']['affiliateUrl'].'<br><br>'); 8print($arr['Items'][5]['Item']['affiliateUrl'].'<br><br>'); 9print($arr['Items'][6]['Item']['affiliateUrl'].'<br><br>'); 10print($arr['Items'][7]['Item']['affiliateUrl'].'<br><br>');
下はvar_damp($arr)によって出力された配列です。
PHP
1array(10) { 2 ["Items"]=> 3 array(30) { 4 [0]=> 5 array(1) { 6 ["Item"]=> 7 array(35) { 8 ["mediumImageUrls"]=> 9 array(3) { 10 [0]=> 11 array(1) { 12 ["imageUrl"]=> 13 string(100) "https://thumbnail.image.rakuten.co.jp/@0_mall/eikoshop11/cabinet/zg0982020/zg098-01n.jpg?_ex=128x128" 14 } 15 [1]=> 16 array(1) { 17 ["imageUrl"]=> 18 string(99) "https://thumbnail.image.rakuten.co.jp/@0_mall/eikoshop11/cabinet/zg0982020/zg098-02.jpg?_ex=128x128" 19 } 20 [2]=> 21 array(1) { 22 ["imageUrl"]=> 23 string(101) "https://thumbnail.image.rakuten.co.jp/@0_mall/eikoshop11/cabinet/zg0982020/zg098-03-1.jpg?_ex=128x128" 24 } 25 } 26 ["pointRate"]=> 27 int(1) 28 ["shopOfTheYearFlag"]=> 29 int(0) 30 ["affiliateRate"]=> 31 int(2) 32 ["shipOverseasFlag"]=> 33 int(0) 34 ["asurakuFlag"]=> 35 int(1) 36 ["endTime"]=> 37 string(0) "" 38 ["taxFlag"]=> 39 int(0) 40 ["startTime"]=> 41 string(0) "" 42 ["itemCaption"]=> 43 string(1915) "商品名 送料無料モバイルバッテリー大容量10000mAh iPhone&Android両方対応極薄軽量ケーブル内蔵型6色iPhone8 iPhoneX iPhone7 Plus アイフォン7 iPhone6 plus iPhone6 iPhone6s plus iPhone5 SE携帯充電器4台同時充電可能 特徴 バッテリー容量:10000mAh 出力電圧:DC5V/2.4A 入力電圧:DC5V/2A 重量:210g サイズ:135*70*128mm 適応機器:iPhone8 iPhoneX iPhone7 iPhone6/6S/plus iPad Andriod機種など 充電回数:3.5回 付属品ケーブル カラー カラー:6色(グレー、ゴールド、ホワイト、ピング、ブルー、ブラック) 生産国 中国 ●2019年4月1日Type-C内臓ケーブルを追加いたしました。エクスペリアType-Bに対応しておりません。 ご注意 ●商品の色見はご覧のパソコンの環境により、実物と多少異なって見える場合がございますのでご了承ください。 ●ご注文いただきました商品であっても品切れの場合がございますのでご了承ください。その場合はメールにておしらせいたします。 ●ポーチは色落ち可能性ございますので、ご使用の際はご注意ください。尚、サービスポーチついての色落ち等の対応はしておりません。モバイルバッテリー 10000mAh大容量 極薄軽量 6色 バッテリー容量:10000mAh 出力電圧:DC5V/2.4A 入力電圧:DC5V/2A 重量:210g カラー:6色(グレー、ゴールド、ホワイト、ピング、ブルー、ブラック) サイズ:135*70*128mm 適応機器:iPhone8 iPhoneX iPhone7 iPhone6/6S/plus iPhone5/SE ipad Andriod機種など 充電回数:3.5回 付属品:ケーブル ●2019年4月1日Type-C内臓ケーブルを追加いたしました。 同梱おすすめ 同梱おすすめ 1280円(税込/送料無料) 1,480円(税込/送料無料)" 44 ["catchcopy"]=> 45 string(93) "防災 ギフトiPhone&Android&Typec対応 2.4A 登山 キャンプ 外出 機内持ち込み" 46 ["tagIds"]=> 47 array(10) { 48 [0]=> 49 int(1000873) 50 [1]=> 51 int(1000876) 52 [2]=> 53 int(1000880) 54 [3]=> 55 int(1000881) 56 [4]=> 57 int(1000885) 58 [5]=> 59 int(1000886) 60 [6]=> 61 int(1002891) 62 [7]=> 63 int(1005126) 64 [8]=> 65 int(1016358) 66 [9]=> 67 int(1019017) 68 } 69 ["smallImageUrls"]=> 70 array(3) { 71 [0]=> 72 array(1) { 73 ["imageUrl"]=> 74 string(98) "https://thumbnail.image.rakuten.co.jp/@0_mall/eikoshop11/cabinet/zg0982020/zg098-01n.jpg?_ex=64x64" 75 } 76 [1]=> 77 array(1) { 78 ["imageUrl"]=> 79 string(97) "https://thumbnail.image.rakuten.co.jp/@0_mall/eikoshop11/cabinet/zg0982020/zg098-02.jpg?_ex=64x64" 80 } 81 [2]=> 82 array(1) { 83 ["imageUrl"]=> 84 string(99) "https://thumbnail.image.rakuten.co.jp/@0_mall/eikoshop11/cabinet/zg0982020/zg098-03-1.jpg?_ex=64x64" 85 } 86 } 87 ["asurakuClosingTime"]=> 88 string(5) "12:00" 89 ["imageFlag"]=> 90 int(1) 91 ["availability"]=> 92 int(1) 93 ["shopAffiliateUrl"]=> 94 string(167) "https://hb.afl.rakuten.co.jp/hgc.........." 95 ["itemCode"]=> 96 string(19) "eikoshop11:10000058" 97 ["postageFlag"]=> 98 int(0) 99 ["itemName"]=> 100 string(314) "【バッテリーポーチプレゼント中&3種類ケーブル内蔵】 モバイルバッテリー 大容量 Typec 充電器ケーブル内蔵型 極薄軽量10000mAhiPhone &Android&Type-Cすべて対応 プレゼントiPhone11 iPhonexs iPhonexsm iPhone8 iPhoneXiPhone7 Plus iPhone64台同時充電可能" 101 ["itemPrice"]=> 102 int(1380) 103 ["pointRateEndTime"]=> 104 string(0) "" 105 ["shopCode"]=> 106 string(10) "eikoshop11" 107 ["affiliateUrl"]=> 108 string(191) "https://hb.afl.rakuten.co.jp/hgc............" 109 ["giftFlag"]=> 110 int(0) 111 ["shopName"]=> 112 string(13) "エイコShop" 113 ["reviewCount"]=> 114 int(4969) 115 ["asurakuArea"]=> 116 string(385) "群馬県/埼玉県/千葉県/東京都/神奈川県/新潟県/富山県/石川県/福井県/山梨県/青森県/長野県/岐阜県/静岡県/愛知県/三重県/滋賀県/京都府/大阪府/兵庫県/奈良県/岩手県/和歌山県/鳥取県/島根県/岡山県/広島県/山口県/徳島県/香川県/愛媛県/高知県/宮城県/秋田県/山形県/福島県/茨城県/栃木県" 117 ["shopUrl"]=> 118 string(167) "https://hb.afl.rakuten.co.jp/hgc............" 119 ["creditCardFlag"]=> 120 int(1) 121 ["reviewAverage"]=> 122 float(4.22) 123 ["shipOverseasArea"]=> 124 string(0) "" 125 ["genreId"]=> 126 string(6) "564277" 127 ["pointRateStartTime"]=> 128 string(0) "" 129 ["itemUrl"]=> 130 string(191) "https://hb.afl.rakuten.co.jp/hgc..............." 131 } 132 } 133 [1]=> 134 array(1) { 135 ["Item"]=> 136 array(35) { 137 } 138 }.....
試したこと
['Items']の後の整数が入っいている[]に$iを渡し、for文による繰り返し構文で$iに1〜20までの数字を渡したのですが、最初のURL以降は取得できませんでした。
for文が機能していないのではと、「echo $i」も行いましたが、こちらは正常に1〜20を出力しました。
PHP
1for($i=0; $i<20; $i++;) { 2 print($arr['Items'][$i]['Item']['affiliateUrl'].'<br><br>'); 3 echo $i; 4}
foreachによる繰り返し処理も試しましたが、うまくいきませんでした。試したコードは下記です。
PHP
1foreach($arr['Items'] as $value){ 2 print($key); 3 print($value); 4}
結果
ArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArray
PHP
1foreach($arr['Items'] as $key => $value){ 2 print($key); 3 print($value); 4}
結果
0Array1Array2Array3Array4Array5Array6Array7Array8Array9Array10Array11Array12Array13Array..........
その他やりたいこと
もしできれば、affiliateURL以外の値も取得したいのでその方法と、上記のコードでは「print」で出力していますが、実際の環境では変数に置くなどして,htmlとcssで整形もしていきたいので、その方法まで教えていただけると幸いです。
回答2件
あなたの回答
tips
プレビュー