🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JSON

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

PHP

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

Q&A

解決済

3回答

879閲覧

phpでjsonデータの取得の仕方

sato.aj

総合スコア14

JSON

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

PHP

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

0グッド

0クリップ

投稿2019/09/10 06:52

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
googleAPIを使用して本の検索結果をサイトに表示しようとしています。
jsonで得た結果のtitleだけを取り出す方法がわからないので教えてほしいです。

該当のソースコード

html

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 7 <title>Document</title> 8</head> 9<body> 10<form action="post.php" method="post"> 11 <input type="text" name="book"> 12 <button type="submit">検索</button> 13</form> 14</body> 15</html>

php

1<?php 2if(isset($_POST['book'])){ 3 $data="https://www.googleapis.com/books/v1/volumes?q=".$_POST['book']; 4 $json=file_get_contents($data); 5 $decos=json_decode($json,true); 6 foreach($decos as $deco){ 7 var_dump($deco[0]['items']['title']); 8 } 9}

試したこと

上のコードだとnullとなります。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答3

0

<?php if(isset($_POST['book'])){ $data="https://www.googleapis.com/books/v1/volumes?q=".$_POST['book']; $json=file_get_contents($data); $decos=json_decode($json,true); var_dump($decos); }

var_dump() 出力をよく見て、以下の記事を参考に値を取り出してください。

https://qiita.com/ShibuyaKosuke/items/5ba8001b52843edc0fe5

投稿2019/09/10 06:56

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

m.ts10806

2019/09/10 06:59

答え書いてしまった・・。
sato.aj

2019/09/10 07:07

参考にさせていただきます。ありがとうございました。
guest

0

ベストアンサー

例えば下記のようにすると階層が見えてきます。

php

1$data="https://www.googleapis.com/books/v1/volumes?q=PHP"; 2$json=file_get_contents($data); 3$decos=json_decode($json,true); 4var_dump($decos); 5/** 6array(3) { 7 ["kind"]=> 8 string(13) "books#volumes" 9 ["totalItems"]=> 10 int(1261) 11 ["items"]=> 12 array(10) { 13 [0]=> 14 array(8) { 15 ["kind"]=> 16 string(12) "books#volume" 17 ["id"]=> 18 string(12) "UVcAwWNZ7J8C" 19 ["etag"]=> 20 string(11) "k2oiUOql3pU" 21 ["selfLink"]=> 22 string(56) "https://www.googleapis.com/books/v1/volumes/UVcAwWNZ7J8C" 23 ["volumeInfo"]=> 24 array(18) { 25 ["title"]=> 26 string(24) "プログラミングPHP" 27 28//省略 29**/

これを参考にすれば「どう辿れば良いか」が見えてきます。

※コード書いていましたが編集削除しています。
履歴見れば答えが分かりますが、まずは自身でやってみてできたあとに答え合わせで確認してください。

投稿2019/09/10 06:59

編集2019/09/10 07:05
m.ts10806

総合スコア80875

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

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

sato.aj

2019/09/10 07:06

階層がよくわかっていなかったです。よく確認してみます。ありがとうございました。
m.ts10806

2019/09/10 07:07

Kosuke_Shibuyaさんの回答に提示された記事をよく読んでおいてください。 配列において、階層をきちんと把握しておくことは必須なので、var_dump()の使い方が大事です。
guest

0

php

1<?php 2echo $decos[items][0]['volumeInfo']['title']; 3?>

こちらで取得できました。

php

1<?php 2echo $decos['items'][0]['volumeInfo']['title']; 3?>

間違えました。こうでした。

php

1<?php 2foreach($decos['items'] as $deco){ 3 echo $deco['volumeInfo']['title']."\n"; 4 } 5?>

こちらで一覧が取得できました。ありがとうございます。

投稿2019/09/10 07:40

編集2019/09/10 07:58
sato.aj

総合スコア14

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

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

m.ts10806

2019/09/10 07:44

items ←これだと定数と解釈されるのでエラーになりますよ。 >PHP Warning: Use of undefined constant items - assumed 'items'
sato.aj

2019/09/10 07:59

修正しました。ありがとうございます。
m.ts10806

2019/09/10 08:10

>echo $decos['items'][0]['volumeInfo']['title']; これはこれで「1番目を取得する」ので合ってますよ。 なので流れとしては下記 ------- var_dump()で変数に格納された情報の階層を確認し echo $decos['items'][0]['volumeInfo']['title']; で1番目のtitleが取得できたので、 $decos['items']をループすることで全てのtitle取得が確認できた
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問