JsonをPHPで操作
解決済
回答 2
投稿
- 評価
- クリップ 0
- VIEW 1,329
下記のようなJsonコードがあるとして、phpで扱うためにはどうしたらよろしいでしょうか?
Jsonあまり触ったことないのでメンバへのアクセスがイマイチわからないと言いますか...
if(typeof(xml)=='undefined') xml = {};
xml.data = {"line_cd":11302,"line_name":"JR山手線","line_lon":139.73522275686264,"line_lat":35.69302730762992,"line_zoom":12,"station_l":[{"station_cd":1130201,"station_g_cd":1130201,"station_name":"大崎","lon":139.728439,"lat":35.619772},{"station_cd":1130202,"station_g_cd":1130202,"station_name":"五反田","lon":139.723822,"lat":35.625974},{"station_cd":1130203,"station_g_cd":1130203,"station_name":"目黒","lon":139.715775,"lat":35.633923},{"station_cd":1130204,"station_g_cd":1130204,"station_name":"恵比寿","lon":139.71007,"lat":35.646685},{"station_cd":1130205,"station_g_cd":1130205,"station_name":"渋谷","lon":139.701238,"lat":35.658871},{"station_cd":1130206,"station_g_cd":1130206,"station_name":"原宿","lon":139.702592,"lat":35.670646},{"station_cd":1130207,"station_g_cd":1130207,"station_name":"代々木","lon":139.702042,"lat":35.683061},{"station_cd":1130208,"station_g_cd":1130208,"station_name":"新宿","lon":139.700464,"lat":35.689729},{"station_cd":1130209,"station_g_cd":1130209,"station_name":"新大久保","lon":139.700261,"lat":35.700875},{"station_cd":1130210,"station_g_cd":1130210,"station_name":"高田馬場","lon":139.703715,"lat":35.712677},{"station_cd":1130211,"station_g_cd":1130211,"station_name":"目白","lon":139.706228,"lat":35.720476},{"station_cd":1130212,"station_g_cd":1130212,"station_name":"池袋","lon":139.711086,"lat":35.730256},{"station_cd":1130213,"station_g_cd":1130213,"station_name":"大塚","lon":139.728584,"lat":35.731412},{"station_cd":1130214,"station_g_cd":1130214,"station_name":"巣鴨","lon":139.739303,"lat":35.733445},{"station_cd":1130215,"station_g_cd":1130215,"station_name":"駒込","lon":139.748053,"lat":35.736825},{"station_cd":1130216,"station_g_cd":1130216,"station_name":"田端","lon":139.761229,"lat":35.737781},{"station_cd":1130217,"station_g_cd":1130217,"station_name":"西日暮里","lon":139.766857,"lat":35.731954},{"station_cd":1130218,"station_g_cd":1130218,"station_name":"日暮里","lon":139.771287,"lat":35.727908},{"station_cd":1130219,"station_g_cd":1130219,"station_name":"鶯谷","lon":139.778015,"lat":35.721484},{"station_cd":1130220,"station_g_cd":1130220,"station_name":"上野","lon":139.777043,"lat":35.71379},{"station_cd":1130221,"station_g_cd":1130221,"station_name":"御徒町","lon":139.774727,"lat":35.707282},{"station_cd":1130222,"station_g_cd":1130222,"station_name":"秋葉原","lon":139.773288,"lat":35.698619},{"station_cd":1130223,"station_g_cd":1130223,"station_name":"神田","lon":139.770641,"lat":35.691173},{"station_cd":1130224,"station_g_cd":1130101,"station_name":"東京","lon":139.766103,"lat":35.681391},{"station_cd":1130225,"station_g_cd":1130225,"station_name":"有楽町","lon":139.763806,"lat":35.675441},{"station_cd":1130226,"station_g_cd":1130102,"station_name":"新橋","lon":139.758587,"lat":35.666195},{"station_cd":1130227,"station_g_cd":1130227,"station_name":"浜松町","lon":139.757135,"lat":35.655391},{"station_cd":1130228,"station_g_cd":1130228,"station_name":"田町","lon":139.747575,"lat":35.645736},{"station_cd":1130229,"station_g_cd":1130103,"station_name":"品川","lon":139.738999,"lat":35.62876}]}
if(typeof(xml.onload)=='function') xml.onload(xml.data);
xmlもあまり扱ったことないですが、こちらは感覚的にわかりました。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>サンプル</title>
</head>
<body>
<?php
$req = "http://www.ekidata.jp/api/l/11302.xml";
$xml = simplexml_load_file($req)
or die("XMLパースエラー");
echo "鉄道線名:".$xml->line->line_name."<br>";
echo "軽度:".$xml->line->line_lon."<br>";
echo "経緯:".$xml->line->line_lat."<br>";
?>
<table>
<thead>
<tr>
<th>駅名</th>
<th>軽度</th>
<th>経緯</th>
</tr>
</thead>
<tbody>
<?php
for($i=0;$i<count($xml->station);$i++){
echo "<tr>";
echo "<td>".$xml->station[$i]->station_name."</td>";
echo "<td>".$xml->station[$i]->lon."</td>";
echo "<td>".$xml->station[$i]->lat."</td>";
echo "</tr>";
}
?>
</tbody>
</table>
<?php
//$xmlオブジェクトの中身を確認する場合は、以下のコメントを外す
echo "<pre>";
print_r ($xml);
echo "</pre>";
?>
</body>
</html>
Jsonも途中まで試していますがなかなか取り出せないです。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>サンプル</title>
</head>
<body>
<?php
$url = "http://www.ekidata.jp/api/l/11302.json";
$json = file_get_contents($url);
$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
$arr = json_decode($json,true);
echo "鉄道線名:".$json->line_name."<br>";
echo "軽度:".$xml->line->line_lon."<br>";
echo "経緯:".$xml->line->line_lat."<br>";
?>
<table>
<thead>
<tr>
<th>駅名</th>
<th>軽度</th>
<th>経緯</th>
</tr>
</thead>
<tbody>
<?php
for($i=0;$i<count($xml->station);$i++){
echo "<tr>";
echo "<td>".$xml->station[$i]->station_name."</td>";
echo "<td>".$xml->station[$i]->lon."</td>";
echo "<td>".$xml->station[$i]->lat."</td>";
echo "</tr>";
}
?>
</tbody>
</table>
<?php
//$xmlオブジェクトの中身を確認する場合は、以下のコメントを外す
echo "<pre>";
print_r ($json);
echo "</pre>";
?>
</body>
</html>
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
for文の中身が$xmlを使っているままですので、こちらをjsonデータに修正してください。
また、その他の部分でも$jsonを何とかしようとしていますが、せっかく
$arr = json_decode($json,true);
とされているので、この$arrをforeachで回すなりしたらいいのではないでしょうか。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
json_decode()した$jsonデータを$arrで受けているなら
$arrからデータを取り出せば良いのでは?
<?PHP
$xml='{"line_cd":11302,"line_name":"JR山手線","line_lon":139.73522275686264,"line_lat":35.69302730762992,"line_zoom":12,"station_l":[{"station_cd":1130201,"station_g_cd":1130201,"station_name":"大崎","lon":139.728439,"lat":35.619772},{"station_cd":1130202,"station_g_cd":1130202,"station_name":"五反田","lon":139.723822,"lat":35.625974},{"station_cd":1130203,"station_g_cd":1130203,"station_name":"目黒","lon":139.715775,"lat":35.633923},{"station_cd":1130204,"station_g_cd":1130204,"station_name":"恵比寿","lon":139.71007,"lat":35.646685},{"station_cd":1130205,"station_g_cd":1130205,"station_name":"渋谷","lon":139.701238,"lat":35.658871},{"station_cd":1130206,"station_g_cd":1130206,"station_name":"原宿","lon":139.702592,"lat":35.670646},{"station_cd":1130207,"station_g_cd":1130207,"station_name":"代々木","lon":139.702042,"lat":35.683061},{"station_cd":1130208,"station_g_cd":1130208,"station_name":"新宿","lon":139.700464,"lat":35.689729},{"station_cd":1130209,"station_g_cd":1130209,"station_name":"新大久保","lon":139.700261,"lat":35.700875},{"station_cd":1130210,"station_g_cd":1130210,"station_name":"高田馬場","lon":139.703715,"lat":35.712677},{"station_cd":1130211,"station_g_cd":1130211,"station_name":"目白","lon":139.706228,"lat":35.720476},{"station_cd":1130212,"station_g_cd":1130212,"station_name":"池袋","lon":139.711086,"lat":35.730256},{"station_cd":1130213,"station_g_cd":1130213,"station_name":"大塚","lon":139.728584,"lat":35.731412},{"station_cd":1130214,"station_g_cd":1130214,"station_name":"巣鴨","lon":139.739303,"lat":35.733445},{"station_cd":1130215,"station_g_cd":1130215,"station_name":"駒込","lon":139.748053,"lat":35.736825},{"station_cd":1130216,"station_g_cd":1130216,"station_name":"田端","lon":139.761229,"lat":35.737781},{"station_cd":1130217,"station_g_cd":1130217,"station_name":"西日暮里","lon":139.766857,"lat":35.731954},{"station_cd":1130218,"station_g_cd":1130218,"station_name":"日暮里","lon":139.771287,"lat":35.727908},{"station_cd":1130219,"station_g_cd":1130219,"station_name":"鶯谷","lon":139.778015,"lat":35.721484},{"station_cd":1130220,"station_g_cd":1130220,"station_name":"上野","lon":139.777043,"lat":35.71379},{"station_cd":1130221,"station_g_cd":1130221,"station_name":"御徒町","lon":139.774727,"lat":35.707282},{"station_cd":1130222,"station_g_cd":1130222,"station_name":"秋葉原","lon":139.773288,"lat":35.698619},{"station_cd":1130223,"station_g_cd":1130223,"station_name":"神田","lon":139.770641,"lat":35.691173},{"station_cd":1130224,"station_g_cd":1130101,"station_name":"東京","lon":139.766103,"lat":35.681391},{"station_cd":1130225,"station_g_cd":1130225,"station_name":"有楽町","lon":139.763806,"lat":35.675441},{"station_cd":1130226,"station_g_cd":1130102,"station_name":"新橋","lon":139.758587,"lat":35.666195},{"station_cd":1130227,"station_g_cd":1130227,"station_name":"浜松町","lon":139.757135,"lat":35.655391},{"station_cd":1130228,"station_g_cd":1130228,"station_name":"田町","lon":139.747575,"lat":35.645736},{"station_cd":1130229,"station_g_cd":1130103,"station_name":"品川","lon":139.738999,"lat":35.62876}]}';
$arr=json_decode($xml);
echo "鉄道線名:".$arr->line_name."<br>";
echo "軽度:".$arr->line_lon."<br>";
echo "経緯:".$arr->line_lat."<br>";
?>
<table>
<thead>
<tr>
<th>駅名</th>
<th>軽度</th>
<th>経緯</th>
</tr>
</thead>
<tbody>
<?php
foreach($arr->station_l as $val){
echo "<tr>";
echo "<td>".$val->station_name."</td>";
echo "<td>".$val->lon."</td>";
echo "<td>".$val->lat."</td>";
echo "</tr>";
}
?>
</tbody>
</table>
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.34%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/09/01 18:22
と言いますかまだです。
まず
echo "鉄道線名:".$json->line_name."<br>";
で表示させようとしてますが、それができないので質問させていただいています。
表示できたら$jsonに修正するつもりですが、まず表示ができません。
2016/09/01 18:27
file_get_contentsもmb_convert_encodingも、どちらも文字列を返すfunctionですので。
回答にも書いていますが、json_decodeされているのですから、$arrを使ってください。
jsonの中身がわからないのでどう書けばいいかは言えませんが、まずはvar_dump($arr)で中身を見ていただくといいかと思います。
2016/09/01 18:28
$jsonは文字列型なので、$json->line_name と言った呼び出しは出来ませんよ、と言う事です。
2016/09/01 18:43
元のJsonファイルが
xml.data = {"line_cd":11302,"line・・・・・・・・
のようにxml.dataとやらに代入しているように見えるのですが、必要なものは
"line_cd":11302,"line・・・・・・・・
になるのですが、どうやって表示させればいいのでしょうか?
2016/09/01 18:52
これ、データ提供側で不具合が発生しているんじゃないですか?
$jsonに入ってくるデータが、質問文の最初に提示されたコードなわけですよね。
データ提供側の運営者に相談してみてください。
「JSONのデータがJSONではなくコードになっているが、不具合ではないか」と。
2016/09/01 18:58
ありがとうございます。
少しわかってきました。