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

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

ただいまの
回答率

90.50%

  • PHP

    24093questions

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

  • HTML

    11531questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • WordPress

    8951questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

  • API

    1832questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

<tr><td>の表にしたい

受付中

回答 2

投稿

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

442ky119

score -91

今、グルナビのレストラン検索apiを使っています。
初めての利用で色々と困っています。
一つがapiで入手したデータをウェブで表示する際のことです。
<tr><td>を使えば情報を綺麗に表示することは可能なのは知っていますが下記のコードのレスポンスフィールドforeach((array)$obj as $key => $val){・・・以下を<tr><td>の中に収めるにはどう書けばいいですか?
<tr><td>の書き方はわかりますが、下記のコードはグルナビのapiサイトから引用したものなので<tr><td>の表の中に入れるように変換するにはどうすればいいですか?

$html     = '<tr><td>%1$s</td><td>%2$s</td><td>%3$s</td><td>%4$s</td><td>%5$s</td></tr>';
<?php
/*****************************************************************************************
  ぐるなびWebサービスのレストラン検索APIで緯度経度検索を実行しパースするプログラム
  注意:緯度、経度、範囲の値は固定で入れています。
     アクセスキーはユーザ登録時に発行されたキーを指定してください。
*****************************************************************************************/

//エンドポイントのURIとフォーマットパラメータを変数に入れる
$uri   = "http://api.gnavi.co.jp/RestSearchAPI/20150630/";
//APIアクセスキーを変数に入れる
$acckey= "input your accesskey";
//返却値のフォーマットを変数に入れる
$format= "json";
//緯度・経度、範囲を変数に入れる
//緯度経度は日本測地系で日比谷シャンテのもの。範囲はrange=1で300m以内を指定している。
$lat   = 35.670083;
$lon   = 139.763267;
$range = 1;

//URL組み立て
$url  = sprintf("%s%s%s%s%s%s%s%s%s%s%s", $uri, "?format=", $format, "&keyid=", $acckey, "&latitude=", $lat,"&longitude=",$lon,"&range=",$range);
//API実行
$json = file_get_contents($url);
//取得した結果をオブジェクト化
$obj  = json_decode($json);

//結果をパース
//トータルヒット件数、店舗番号、店舗名、最寄の路線、最寄の駅、最寄駅から店までの時間、店舗の小業態を出力
foreach((array)$obj as $key => $val){
   if(strcmp($key, "total_hit_count" ) == 0 ){
       echo "total:".$val."\n";
   }

   if(strcmp($key, "rest") == 0){
       foreach((array)$val as $restArray){
            if(checkString($restArray->{'id'}))   echo $restArray->{'id'}."\t";
            if(checkString($restArray->{'name'})) echo $restArray->{'name'}."\t";
            if(checkString($restArray->{'access'}->{'line'}))    echo (string)$restArray->{'access'}->{'line'}."\t";
            if(checkString($restArray->{'access'}->{'station'})) echo (string)$restArray->{'access'}->{'station'}."\t";
            if(checkString($restArray->{'access'}->{'walk'}))    echo (string)$restArray->{'access'}->{'walk'}."分\t";

            foreach((array)$restArray->{'code'}->{'category_name_s'} as $v){
                if(checkString($v)) echo $v."\t";
            }
            echo "\n";
       }

   }
}

//文字列であるかをチェック
function checkString($input)
{

    if(isset($input) && is_string($input)) {
        return true;
    }else{
        return false;
    }

}
?>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • tkanda

    2016/06/12 19:20 編集

    $json = file_get_contents($url);

    で取得した $json 変数(テキスト)はどのような文字列か、追記できますか?

    キャンセル

  • 442ky119

    2016/06/12 20:55

    すみません、jsonではなくxmlで出力したいんです。
    引用しただけでxmlに変換するの忘れていました。
    xmlに変換したコードを提示します。

    キャンセル

  • 退会済みユーザー

    2016/06/13 21:08

    こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 2

+4

サンプルコードが「C言語しか書いたことないだろ…」と言いたくなるような雰囲気が漂う酷いコードだったので,ついカッとなって綺麗に書きなおしてしまいました…

<?php

/**
 * HTMLにテキストを出力する際は必ずこの関数を通す 
 */
function h($str)
{
    return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}

// エンドポイントとパラメータを定義
$endpoint = 'http://api.gnavi.co.jp/RestSearchAPI/20150630/';
$params = [
    'keyid' => '04377bf256ad862acecf68ea87f6bc1b',
    'format' => 'json',
    'latitude' => '35.670083',
    'longitude' => '139.763267',
    'range' => '1',
];

// リクエスト実行
$ch = curl_init();
curl_setopt_array($ch, [
    CURLOPT_URL => $endpoint . '?' . http_build_query($params, '', '&'),
    CURLOPT_RETURNTRANSFER => true, // レスポンスボディを返り値として取得
    CURLOPT_FAILONERROR => true, // HTTPステータス400以上はエラーと見なす
    CURLOPT_ENCODING => 'gzip', // 通信を圧縮する
]);
$response = curl_exec($ch);

// エラーのときはテキストとしてエラーメッセージを出して終了
if ($response === false) {
    header('Content-Type: text/plain; charset=UTF-8', true, 500);
    exit(curl_error($ch));
}

// API側がクソ実装してなければこのjson_decodeは必ず成功するはず
$obj = json_decode($response);

// HTMLとして表示
header('Content-Type: text/html; charset=UTF-8');

?>
<!DOCTYPE html>
<title>Example</title>
<?php foreach ($obj->rest as $r): ?>
<table border="1">
    <caption><?=h($r->name)?></caption>
    <tr>
        <th>ID</th>
        <td><?=h($r->id)?></td>
    </tr>
    <tr>
        <th>店舗名</th>
        <td><?=h($r->name)?></td>
    </tr>
    <tr>
        <th>アクセス</th>
        <td><?=h($r->access->line)?><?=h($r->access->station)?>から<?=h($r->access->walk)?></td>
    </tr>
</table>
<?php endforeach; ?>

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/13 00:57

    ご回答ありがとうございます。
    すみません、実はxmlで使いたいのですがjsonの所をxmlに変換するだけで大丈夫ですよね?
    obj = xml_decode($response);

    キャンセル

  • 2016/06/13 01:03 編集

    xml_decodeという関数は存在しません.SimpleXMLElementオブジェクトとして読み込むことになると思います…が,これは初心者が躓きやすい罠をたくさん持っているので,JSONをおすすめします.JSONのほうが構造がシンプルです.

    JSONのデータ型はPHPのデータ型に全てそのまま1対1で対応付けできますが,XMLは重複している要素が配列のように存在できたり,属性値を持っていたりして,JSONより遥かに取り扱いが複雑になります.

    キャンセル

  • 2016/06/13 01:06

    【文字列型/整数型/論理型の保持ができるか】

    json_decode
    → できる

    SimpleXMLElement
    → できない上に,最終的に求める型に手動でキャストしなければならない
    → 例: 文字列型の場合は (string)$element のようなコードになる

    キャンセル

  • 2016/06/13 01:28

    ご回答ありがとうございます。
    jsonの方が簡単なのですね。

    キャンセル

+1

少しずつ試しでechoで出力して、結果を確認すれば自分で解決できるようになりますよー。
頑張って。
動作確認してませんが、こんな感じでできるのでは?

foreach((array)$val as $restArray){
echo '<tr>'
            if(checkString($restArray->{'id'}))   echo '<td>'.$restArray->{'id'}."</td>";
            ・・・
echo '</tr>'

       }

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • PHP

    24093questions

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

  • HTML

    11531questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • WordPress

    8951questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

  • API

    1832questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。