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

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

ただいまの
回答率

88.34%

JsonをPHPで操作

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,329

earnest_gay

score 403

下記のような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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

for文の中身が$xmlを使っているままですので、こちらをjsonデータに修正してください。
また、その他の部分でも$jsonを何とかしようとしていますが、せっかく

$arr = json_decode($json,true);


とされているので、この$arrをforeachで回すなりしたらいいのではないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/01 18:43

    $arrはNULLでした。

    元のJsonファイルが
    xml.data = {"line_cd":11302,"line・・・・・・・・

    のようにxml.dataとやらに代入しているように見えるのですが、必要なものは
    "line_cd":11302,"line・・・・・・・・
    になるのですが、どうやって表示させればいいのでしょうか?

    キャンセル

  • 2016/09/01 18:52

    file_get_contentsしているURLにアクセスしてみてわかりましたが。
    これ、データ提供側で不具合が発生しているんじゃないですか?
    $jsonに入ってくるデータが、質問文の最初に提示されたコードなわけですよね。
    データ提供側の運営者に相談してみてください。
    「JSONのデータがJSONではなくコードになっているが、不具合ではないか」と。

    キャンセル

  • 2016/09/01 18:58

    なるほど、、、
    ありがとうございます。

    少しわかってきました。

    キャンセル

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>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/01 18:33

    yambeさんのご提示いただいているものだと表示されますが

    $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 "<pre>";
    print_r ($arr);
    echo "</pre>";


    で確認すると何も表示されないのですが、、、

    キャンセル

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

  • ただいまの回答率 88.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る