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

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

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

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

PHP

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

Q&A

1回答

3427閲覧

PHPでjsonを検索してデータを抽出したい

ksyunnnn

総合スコア60

JSON

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

PHP

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

0グッド

0クリップ

投稿2017/06/21 08:17

編集2017/06/22 01:01

###前提

  • PHP : 5.4.16

実現したいこと

下記のjsonから"month"キーで検索をし、データを抽出したいです。

json

1[ 2 { 3 "month": "201706", 4 "status": "committed", 5 "card": { 6 "number": "8107-7454-4526-5963 ", 7 "name": "佐藤 哲夫", 8 "joined_at": "2016年10月3日", 9 "bank": "新生銀行", 10 "store": "本店", 11 "kind": "普通", 12 "bank_number": "1352***", 13 "card_kind": "カート" 14 }, 15 "payment": { 16 "price": "199", 17 "detail": { 18 "date": "17/04/30", 19 "store": "まいばすけっと 板橋駅南/iD", 20 "price": "199", 21 "kubun": "1", 22 "thistime": "1", 23 "payed_price": "199", 24 "user_name": "佐藤 哲夫", 25 "use_card": "6900-11**-****-1***" 26 } 27 } 28 }, 29 { 30 "month": "201707", 31 "status": "uncommitted", 32 "card": { 33 "number": "4444-7454-4526-5963 ", 34 "name": "内藤 たかし", 35 "joined_at": "2015年12月23日", 36 "bank": "三井住友銀行", 37 "store": "本店", 38 "kind": "普通", 39 "bank_number": "1352***", 40 "card_kind": "カート" 41 }, 42 "payment": { 43 "price": "199", 44 "detail": { 45 "date": "17/04/30", 46 "store": "ファミマ 板橋駅南/iD", 47 "price": "199", 48 "kubun": "1", 49 "thistime": "1", 50 "payed_price": "199", 51 "user_name": "佐藤 哲夫", 52 "use_card": "6900-11**-****-1***" 53 } 54 } 55 }, 56 { 57 "month": "201708", 58 "status": "uncommitted", 59 "card": { 60 "number": "8888-7454-4526-5963 ", 61 "name": "8月 たかし", 62 "joined_at": "2015年12月23日", 63 "bank": "三井住友銀行", 64 "store": "本店", 65 "kind": "普通", 66 "bank_number": "1352***", 67 "card_kind": "カート" 68 }, 69 "payment": { 70 "price": "199", 71 "detail": { 72 "date": "17/04/30", 73 "store": "ファミマ 板橋駅南/iD", 74 "price": "199", 75 "kubun": "1", 76 "thistime": "1", 77 "payed_price": "199", 78 "user_name": "佐藤 哲夫", 79 "use_card": "6900-11**-****-1***" 80 } 81 } 82 }, 83 { 84 "month": "201709", 85 "status": "uncommitted", 86 "card": { 87 "number": "9999-7454-4526-5963 ", 88 "name": "9月 たかし", 89 "joined_at": "2015年12月23日", 90 "bank": "三井住友銀行", 91 "store": "本店", 92 "kind": "普通", 93 "bank_number": "1352***", 94 "card_kind": "カート" 95 }, 96 "payment": { 97 "price": "199", 98 "detail": { 99 "date": "17/04/30", 100 "store": "ファミマ 板橋駅南/iD", 101 "price": "199", 102 "kubun": "1", 103 "thistime": "1", 104 "payed_price": "199", 105 "user_name": "佐藤 哲夫", 106 "use_card": "6900-11**-****-1***" 107 } 108 } 109 } 110]


検索キー:”201708”
返却値:※arrayでもobjectでもなんでもいいです。

{ "month": "201708", "status": "uncommitted", "card": { "number": "8888-7454-4526-5963 ", "name": "8月 たかし", "joined_at": "2015年12月23日", "bank": "三井住友銀行", "store": "本店", "kind": "普通", "bank_number": "1352***", ("card_kind": "カート") }, "payment": { "price": "199", "detail": { "date": "17/04/30", "store": "ファミマ 板橋駅南/iD", "price": "199", "kubun": "1", "thistime": "1", "payed_price": "199", "user_name": "佐藤 哲夫", "use_card": "6900-11**-****-1***" } } }

###試したこと

php

1function getData($ym){ 2 $json = file_get_contents('hoge.json'); 3 4 $data = json_decode($json, true); 5 $key = array_search($ym,array_column($data, 'month')); 6 7 if ($key === false) { 8 return false; 9 } 10 return $data[$key]; 11} 12 13$ym = '201708'; 14$data = getData($ym); 15

発生する問題

現行のPHPのバージョン(5.4.16)では array_column()が利用できないようでした。

###補足情報(言語/FW/ツール等のバージョンなど)
array_column()同等の機能を実装したファンクションも見つけましたが、もっとシンプルな方法はないかと質問させていただきました。

なにか良い方法はないでしょうか?
現行のバージョンで対応するのは難しいとのことであれば、諦めて別の処理を実装するつもりです。

ご意見いただければ幸いです。

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

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

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

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

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

guest

回答1

0

("card_kind": "カート")

カッコが悪さをしてJSON形式として認識できないのでは?

追記

「"month": "201708"」がユニークかどうか担保されないので
普通この手の戻り値は配列にするもんじゃないでしょうか?

かりにjsonの文字列を$strに受けた場合、こうです

PHP

1$json=json_decode($str); 2$month="201708"; 3$match=array_filter($json,function($a) use($month){ 4 return $a->month===$month; 5}); 6print_r($match); 7

とにかく、1個だけとりだすなら
$match=array_shift($match);
とでもしてください

投稿2017/06/21 09:35

編集2017/06/22 01:54
yambejp

総合スコア114775

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

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

ksyunnnn

2017/06/22 01:02

回答いただきありがとうございます。 jsonの内容が実際のものと違うようだったので修正しましたm(_ _)m >カッコが悪さをしてJSON形式として認識できないのでは? すいません、実際はかっこはなかったので、json形式としての認識はうまくいっているはずですm(_ _)m
yambejp

2017/06/22 01:55

jsonデータに記述ミスがないなら追記したとおり試してみて下さい
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問