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

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

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

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

PHP

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

Q&A

解決済

3回答

10365閲覧

PHPでのjsonデータの取り出し

luckyclock

総合スコア73

JSON

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

PHP

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

0グッド

0クリップ

投稿2016/04/02 08:03

http://api.moemoe.tokyo/anime/v1/master/2016/1

上記のAPIのjsonを取り出したいのですが、うまく取りだせません。
一応

PHP

1$obj= json_decode($json, true); 2$obj[0]['title']; 3$obj[1]['title']; 4・・・

でタイトルは取り出せているのですが、
これをどうやってサイズ分回せばいいのでしょうか?
foreachかと思ったのですが、どう記述していいのか
わからない状況です。

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

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

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

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

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

KiyoshiMotoki

2016/04/02 17:18

結局、何がやりたいのですか? ご質問の回答としてはYutaTanaka様のもので言い尽くされており、 ご自身、「そのやり方でも取り出せました。」とおっしゃっているではありませんか。 もし、いずれの回答も望むものではないのであれば、何が知りたいのかを明確にしてください。
kei344

2016/04/03 05:10

いったん「解決済」にされてはいかがでしょうか。
guest

回答3

0

蛇足ですが,json_decodeの第2引数にtrueを渡さないことを推奨します.PHPは何もかも連想配列として一緒くたにしていますが,JSON発祥の言語であるJavaScriptにおいては,

  • オブジェクト {"name":"田中", "age":20}
  • 配列 [1, 2, 3]

というように明確に区別されています.基本的にJSONの時点でオブジェクトであるものは,foreachで回したりarray_*な関数を適用する必要はないことが多く,デコード後もオブジェクトのままであるほうが簡潔に書け,可読性が高いことも挙げられます.

php

1$entries = json_decode($json, true); 2$entry[0]['title']; 3$entry[1]['title']; 4 5foreach ($entries as $entry) { 6 $entry['title']; 7}

こう書いていたものは

php

1$entries = json_decode($json); 2$entry[0]->title; 3$entry[1]->title; 4 5foreach ($entries as $entry) { 6 $entry->title; 7}

こうなります.こっちのほうがいいと思いませんか?

投稿2016/04/02 16:02

mpyw

総合スコア5223

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

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

KiyoshiMotoki

2016/04/02 17:50

> json_decodeの第2引数にtrueを渡さないことを推奨します. ケースバイケースではないでしょうか? リファレンスに記載されているとおり、PHPのプロパティ名として無効な文字を含む要素にアクセスする場合、 プロパティ名を"{}"で囲む必要があります。 http://php.net/manual/ja/function.json-decode.php また、要素名が空文字列("")の場合、第2引数にtrueを渡さない場合は勝手に"_empty_"というプロパティ名に変換されます。 (これも、上記リファレンスの下のほうにコメントされていました。) テストコード <?php $json = '{"":1}'; var_dump(json_decode($json)); var_dump(json_decode($json, true)); ?> 実行結果 object(stdClass)#1 (1) { ["_empty_"]=> int(1) } array(1) { [""]=> int(1) }
mpyw

2016/04/02 19:06

> リファレンスに記載されているとおり、PHPのプロパティ名として無効な文字を含む要素にアクセスする場合、プロパティ名を"{}"で囲む必要があります。 確かにそうですが,APIにおいて特殊文字がJSONオブジェクトのプロパティに割り当てられているケースはごくまれです.(メジャーなところだとYouTubeAPIが$記号を含んでいたような…)ケースバイケースとして引き合いに出す根拠としては少し弱く感じられます. > また、要素名が空文字列("")の場合、第2引数にtrueを渡さない場合は勝手に"_empty_"というプロパティ名に変換されます。 これは初めて知りました.しかし,プロパティ名が空文字列になっているケースは,上記のプロパティ名に特殊記号を含むケースよりも更に稀だと思います. こういう特殊なケースを多く内包しているAPIであれば例外的に連想配列のほうが取り扱いやすいでしょうが,基本的にはやはりオブジェクト優先です.
guest

0

// これじゃだめ?
$data_list = json_decode($json, true);
foreach ($data_list as $data) {
echo $data['title'] .PHP_EOL;
}

投稿2016/04/02 08:39

YutaTanaka

総合スコア12

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

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

luckyclock

2016/04/02 09:58

ありがとうございます。 そのやり方でも取り出せました。
guest

0

ベストアンサー

foreachで簡単に処理できますよ。

【PHPでJSONのデータを処理する方法】
https://syncer.jp/how-to-use-json

JSONデータの構造がわかりにくい場合は下記ようなツールがいくつかあるのでそれを使うとわかりやすくなります。

【JSONデータのデコード整形ツール - Digitra】
http://dev.digitra.net/tools/jsonfairing.php

投稿2016/04/02 08:29

kei344

総合スコア69407

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

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

luckyclock

2016/04/02 09:58

実はそのサイトはすでにみていて、ループ処理のところを参考に foreach ($obj as $key => $value) { echo $obj[$key]; } にするとArrayArray・・・になるし foreach ($obj as $key => $value) { echo $value; } としてもArrayArray・・・ になるしうまくいかないなぁと思っていましたが、 foreach ($obj as $value) { echo $value['title']; } で取り出せました。 $key => $value しかしながら上記の形はどういうとき必要になるのか理解できていません echo $keyとしますとtitleなどの要素名がでるのかと思ったら普通に 0~の配列番号?が出力されただけでした。
kei344

2016/04/02 11:06

> 0~の配列番号?が出力されただけでした。 $obj に入っているのが配列だからです。 > しかしながら上記の形はどういうとき必要になるのか理解できていません foreach ( $obj[ 0 ] as $key => $value ) { echo $key.' : '.$value.'<br />'; } // // こう出るのでは? // title_short2: // twitter_account: gundam_tb // public_url: http://gundam-tb.net/ // title_short1: サンダーボルト // sex: 0 // twitter_hash_tag: gundam_tb // id: 281 // sequel: 0 // created_at: 2016-01-01 23:40:06.0 // cours_id: 9 // title: 機動戦士ガンダム サンダーボルト // title_short3: // updated_at: 2016-01-01 23:40:06.0
YutaTanaka

2016/04/02 11:19 編集

> しかしながら上記の形はどういうとき必要になるのか理解できていません // こういう使い方したりできます foreach ($data_list as $key => $data) { // タイトルが 機動戦士ガンダム サンダーボルト だったら消す if ($data['title'] == ''機動戦士ガンダム サンダーボルト') { unset($data_list[$key]); } }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問