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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

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

API

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

4897閲覧

楽天APIで取得した配列から必要な情報を取り出したい

takato.work

総合スコア11

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

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

API

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/06/30 18:26

編集2020/07/01 02:49

前提・実現したいこと

楽天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 &nbsp; iPhone6/6S/plus&nbsp; 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で整形もしていきたいので、その方法まで教えていただけると幸いです。

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

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

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

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

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

m.ts10806

2020/06/30 21:26

forでどのように書いたのでしょうか
m.ts10806

2020/06/30 21:29

取得したJsonの内容が提示されていないため、他者には検証が不可能である=「こんな感じで組む」程度しかアドバイスができないことも了承ください。(公式のAPIなので、全く見せられないということはないでしょうけど…) APIの返却値の例が記載された記事やドキュメントのURLもご提示ください
takato.work

2020/07/01 01:14

ご回答ありがとうございます。アドバイスの通り、実際に書いたfor文とJsonを配列化したものを「var_damp」で出力したものの一部を追記しました。 ありがとうございます。
guest

回答2

0

多少ループがネストしても、$arr['Items']自体をforeachで回していったほうが良いように思います。
0~20を固定で回すと、キーがないときに配列のキー参照のエラーになりますし。

投稿2020/07/01 01:22

m.ts10806

総合スコア80875

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

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

takato.work

2020/07/01 02:42

ご回答ありがとうございます。 foreach($arr['Items'] as $value ){ print($value); } で処理を行ったところ、Arrayが何個も出てくるだけでした また、 foreach($arr['Items'] as $key => $value){ print($key); print($value); echo '<br>'; } で処理を行った結果、 0Array 1Array 2Array 3Array...... と続くだけでした。おそらく記述の方法が間違っていると思うのですが、どこを直せばよいかご教授いただけるとありがたいです。 ご返信お待ちしております。
phper.k

2020/07/01 02:43

print($value); じゃなくて var_dump($value); 使いましょう
m.ts10806

2020/07/01 02:45

手始めとしては間違ってません。 回答冒頭にかいたように「ループを重ねる」です。 Arrayがでるということは配列がとれてるということなので$valueもループさせるか、配下のキーが全て同じ構成であれば$value[キー名]でキーをたどっていきます
takato.work

2020/07/01 04:26

ご回答頂きありがとうございます。 おふた方ともにとても参考にさせて頂きましたが、別の回答者様がより具体的に説明をしてくださったので恐れながら今回はそちらの方をベストアンサーとさせていただきます。
m.ts10806

2020/07/01 04:57 編集

やはり配列参照とデバッグのしかたを確実におさえられたほうがこの先困らなくて済みます。 今回に特化したやり方を覚えても、今後少し構造が変わるとまた質問する羽目になりそうですし。
guest

0

ベストアンサー

多次元の配列をforeachで走査する場合、
foreachの中で要素に対してforeachを実行する必要があります。

PHP

1foreach($arr['Items'] as $key => $value){ 2 print($key); 3 print($value); 4}

であれば

PHP

1foreach($arr['Items'] as $key => $value){ 2 var_dump($key); 3 foreach($value as $k => $v){ 4 var_dump($k); 5 //$vが配列の場合はさらにforeachをする必要があるので、is_array($v)等で判定して処理をわける 6 var_dump($v); 7 } 8}

みたいな感じです。

投稿2020/07/01 03:10

tanat

総合スコア18727

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

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

takato.work

2020/07/01 03:17

ご回答ありがとうございます。 「var_damp」を使うと配列のような形で一覧が出てきてしまうのですが、「var_damp」を使って出力しているのは配列である確認のためということでしょうか。
tanat

2020/07/01 03:21

var_dump()は変数に何が格納されているかを把握するため使用します。 (そのループ中で変数に何が格納されているのか実際に把握しながらコーディングしないと、どうすればいいのかわからないので) var_dump()はデバッグ以外で使うことは無いので、変数の内容が把握出来たら削除して、適切な出力方法に置き換えます。
takato.work

2020/07/01 04:23

ご丁寧に説明していただきありがとうございます。 foreach($arr['Items'] as $value){ foreach ($value as $key => $v) {    print($v['affiliateUrl']); echo '<br><br>'; } } この記述により「前提、実現したいこと」の記述と同じことができました。また、$v[smallimg]などは更に配列になっているのでその場合はforeachをかけて取り出そうと思います。 また、これで得る事のできた値(今回はURL)を変数などに入れてそれぞれ取り出したい場合、どの様に記述すればよいでしょうか。 実現させたいことは、商品情報を検索によって一覧で取得した後、任意の商品画像をクリックすると「affiliateUrl」をゲットできるという仕組みを作ろうと考えています。 単に「$affiliateUrl」のような変数に渡しても、更新されてしまうのでなにか適切な方法などありましたらご教授いただけると嬉しいです。 だいぶ抽象的な質問になってしまっているので、簡単なヒントやアドバイスをいただけたらと思います。
tanat

2020/07/01 05:10

「affiliateUrl」をゲットできる というのが具体的にどういう挙動かはわかりませんが、 商品画像をクリックして画面遷移させずに何かをしたいという話だと、JavaScriptとの連携が必要になりますね。 方向性としては、 そのHTML要素の中に、$affiliateUrをデータとして出力しておく クリックしたタイミングでJavaScriptで取得して処理する という感じになります。 この辺りは全部一気にやろうとしても難しいので、 1. まずは画面側で理想的なHTMLとJavaScriptを作る ↓ 2. それをPHPで出力する方法を考えてやってみる ↓ 3. APIの仕様上難しければ、HTML側の構造を変更する というのを繰り返しトライしてみてください。
takato.work

2020/07/01 05:12

わかりました頑張って作ってみます。 本題の質問とはずれたところまで丁寧に説明して頂きありがとうございました。 ベストアンサーとさせて頂きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問