PHPでJSONデータへのアクセス方法【初心者向け】

このQ&Aのポイント
  • PHPを使ってJSONデータへのアクセス方法を説明します。
  • 参照したURLにキーワードを入力すると、JSONデータが返ってきます。
  • 具体的なコード例を示し、『nodes』の『name』と『alias』へのアクセス方法を詳しく解説します。
回答を見る
  • ベストアンサー

PHPでJSONデータへのアクセスについて

15年前にC言語を少し学び、以後はVBA等のスクリプト言語をたまにかじっている程度の初級者です。 PHPは今回初めて触ります。 AmazonのサジェストAPIでキーワードを取得しようと試みてみました。 http://completion.amazon.co.jp/search/complete?method=completion&search-alias=aps&mkt=6&q=キーワード このURLにキーワードを放り込むとJSONデータが帰ってきます。 例:キー [ "キー", [ "キーボード", "キーケース", "キーホルダー", "キーケース レディース", "キーケース メンズ", "キーリング", "キースへリング", "キーボード bluetooth", "キーボード 楽器", "キーカバー" ], [ { "nodes": [ { "alias": "computers", "name": "パソコン・周辺機器" }, { "alias": "electronics", "name": "家電&カメラ" }, { "alias": "mi", "name": "楽器" } ] }, {}, {}, {}, {}, {}, {}, {}, {}, {} ], [] ] ■■コード1 予測変換の取得 $text = "キー"; $url = 'http://completion.amazon.co.jp/search/complete?method=completion&search-alias='.$s_alias.'&mkt=6&q='.urlencode($text); $json = file_get_contents($url); $data = json_decode($json,true); foreach( $data[1] as $x){ $x = str_replace( $text , " " , $x); print $x; } このコード1で変換予測まではなんとかアクセス出来ました。 しかし、『nodes』の『name』と『alias』へアクセスするにはどういうコードを書けばアクセスできるか分からず詰まっています。 PHPもJSONも連想配列もよく分かって居ないため、 どの情報へアクセスすれば良いのかわからず数日右往左往してました。 詳しい方、『nodes』の『name』と『alias』へのアクセスの仕方をよろしければご教示下さいませ。

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.1

ほかの言語の経験があって変換予測のところまで取得できているのなら、あと一歩だと思うんですけどね。 ちなみに私はPHPは初心者でjson_decodeはいつか試したいとは思っていたのですが、今日まで使ったことがありませんでした。この質問を見てはじめて触りました。それでもすぐに成功しましたよ。 ヒントをいくつか。 まず、 []でくくられているのが配列、 {}でくくられているのがオブジェクトまたは連想配列。 です。 これが入れ子になっていて、最深で5次元の構造になっています 配列の一次元目の 0番目に、入力したキーワード 1番目に、変換予測が入った配列 2番目に、nodesなどが入った配列 3番目は、空 が入っています。ここまではいいですかね。 で、配列は数字の添字でアクセスします。 オブジェクトまたは連想配列はキーでアクセスします。 …ここまでを踏まえると、nodesの最初のオブジェクトのaliasである「computers」にアクセスするには 「$data[2][0]["nodes"][0]["alias"]」とすればいいのです。 AmazonのサジェストAPIを知らないので、nodesが複数入るのかどうかわからないのですが、常にサンプルのとおり1つしか入らないのだとすると 「$data[2][0]["nodes"][★]["alias"]」で★の部分をループにすればいいだけです。 例えばこんな感じで。 foreach ($data[2][0]["nodes"] as $n){   print "<li>" . $n["alias"] . ":" . $n["name"]; } JSONの入れ子の階層がどうなっているのか、認識できればすぐに分かるようになるのではないかと思いますよ。

Tafnes
質問者

お礼

有難うごうざいます! オブジェクト指向(?)について行けてないのか、 普通の配列と連想配列をごちゃまぜに出来るとは思いもよりませんでした!目からうろこです。 お陰様で無事目的のキーへアクセスが出来ました。 これにてこの質問を閉めさせて頂きたいと思います。 ありがとうございました。

関連するQ&A

  • VBAでJSONをパースする方法について

    VBAでJSONをパースしたく、以下サイトを参考に実装しています。 http://kenchanz.blogspot.com/2011/01/vbajson.html こちらのサイトで記述されている形式のJSONデータをパースすることはできたのですが、 今回パースしたい以下データのアクセス方法を見つけることができません。 ■パースしたいJSONデータ {"lists":[{"KEY":{"NAME":"yamada"}},{"KEY":{"NAME":"hanako"}}]} ■取得したい値 最終的にはlistsキーの値となっている配列に対して、 ループ処理を行い、NAMEキーの値であるyamadaや、hanakoを取得したい ■実装方法 Set objJSON = sc.CodeObject.jsonParse(JSONデータ) Set objJSON2 = objJSON.lists ここまでは動くのですが、以降がわかりません。 有識者の方、どうぞアドバイスを頂けますようお願いいたします。

  • AjaxでPHPに通信(変数データ)がうまくいきません。

    ご指導よろしくお願いいたします。 現在Ajaxを勉強中なのですが、 html側のフォームから、PHPへの通信ができていないようなのです。 自分でプログラムのソースを何度も見直したりして、実行したのですが うまくいきません。 それで、ネット上にあるAjaxのサンプルをいくつか自サーバーで試してみたのですが、やはりうまくいきませんでした。 下記はあるサンプルのソースです。 -------------------------------------------- //yahoo.html <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Yahoo! ウェブ検索Webサービス</title> <script language="JavaScript"> //<![CDATA[ // [送信]ボタンをクリック時の処理を定義 function search() { // 非同期通信を行うためのXMLHttpRequestオブジェクトを生成 try { xmlReq = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) { xmlReq = new XMLHttpRequest(); } // サーバーからの応答時の処理を定義(結果をページへ反映) xmlReq.onreadystatechange = function() { var msg = document.getElementById("result"); if (xmlReq.readyState == 4) { if (xmlReq.status == 200) { var ctt=""; var xmldoc=xmlReq.responseXML.documentElement; var nodes=xmldoc.childNodes; if(nodes.length==0){ ctt="お探しのサイトは見つかりませんでした。"; } else { for (i =0; i < nodes.length; i++) { var node=nodes.item(i); ctt += "<li><a target='_blank' href='" + getNodeValue(node, "Url") + "'>" + getNodeValue(node, "Title") + "</a></li>" } } msg.innerHTML=ctt; } else { msg.innerHTML="通信に失敗しました。"; } } else { msg.innerHTML="通信中…"; } } // サーバーとの通信を開始 xmlReq.open("GET","yahoo.php?keyword=" + encodeURI(document.fm.keyword.value), true); xmlReq.send(null); } // ノードcurrent配下に含まれる要素nameのテキスト値を取得する関数 function getNodeValue(current ,name){ var nodes=current.getElementsByTagName(name); var node=nodes.item(0); var txtNode=node.firstChild; return txtNode.nodeValue; } //]]> </script> </head> <body> <form name="fm"> キーワード: <input type="text" name="keyword" size="15" maxlength="30" /> <input type="button" value="検索" onClick="search()" /> <hr /> <ol type="1"> <div id="result" /> </ol> </form> </body> </html> -------------------------------------------- -------------------------------------------- //yahoo.php <?php // 出力/内部文字コードをUTF-8に設定 mb_http_output('UTF-8'); mb_internal_encoding('UTF-8'); header('Content-Type: text/xml;charset=UTF-8'); $url ='http://api.search.yahoo.co.jp/WebSearchService/V1/webSearch?'; $url.='appid=○○○&query=' .urlencode(mb_convert_encoding($_GET['keyword'],'UTF-8','auto')) .'&'.'result=15'; print(file_get_contents($url)); ?> -------------------------------------------- 上記のhtmlのフォームから文字を入力して実行すると、 "通信中…" と表示されつづけてしまって、PHP側からのデータが帰ってこないのです。 ちなみに、直接キーワードを含んだパラメーターを渡してあげると、 正常にデータが返って来ます。 他のサンプルも同じような挙動をします。 サーバーの問題なのでしょうか? ここ2~3日、プログラムとにらめっこしながら、 ネットにて、解決策を模索していたのですが、ちから尽きてしまいました。 -------------------------------------------- //サーバー環境 ハッスルサーバー(さくら系列) PHP 4.3(CGIモード) -------------------------------------------- どなたかご指導のほど、よろしくお願いいたします。

  • PHPでの検索

    初心者です。 ネットもさがしてみたのですが下記の意味がイマイアチわかりません。 <form name="form2" action="search.php" method="post"> <input type="text" name="keyword" size="25" value="<?= $keyword ?>"> <input type="submit" name="search" value="検索"><br /> <input type="radio" checked name="searchSelect" value="AND">AND  <input type="radio" <?= ($searchSelect == "OR")? "checked" : "" ?> name="searchSelect" value="OR">OR </form> (1)<form name="form2" action="search.php" method="post"> 検索ボタンを押すと「action="search.php"」が起動します。  どういう仕組みなのでしょうか。 (2) <input type="text" name="keyword" size="25" value="<?= $keyword ?>">  作者の説明で、  『前の画面でテキストボックスに入力した値を、デフォルトで表示しています。  <input type="text" name="keyword" size="25" value="<?= $keyword ?>">』  となっていますが、value="<?= $keyword ?>"でなぜそうなるのでしょうか。  また、<?= $keyword ?>の<?= ?>構文はどのような機能があるのでしょうか。 (3)<input type="radio" checked name="searchSelect" value="AND">AND  「value="AND">AND」の右側の「AND]はどういう意味でしょうか。 (4)<input type="radio" <?= ($searchSelect == "OR")? "checked" : "" ?> name="searchSelect" value="OR">OR  作者の説明で、  『(6)前の画面でORラジオボタンが選択されていた場合は、選択(checked)します。  <input type="radio" <?= ($searchSelect == "OR")? "checked" : "" ?> name="searchSelect"  value="OR">OR』  とありますが、<?= ($searchSelect == "OR")? "checked" : "" ?>でなぜそういうことができているのでしょうか。  また、『"checked" : 』の『:』は何の役目をしているのでしょうか。 上記4つの質問でどれでもいいですのでどなたかお教え願えないでしょうか。

    • 締切済み
    • PHP
  • phpが動きません

    <SCRIPT LANGUAGE="PHP"> // Copyright (C) 2001-2004 All right reserved by Shinya Kondo ( CGI KON ) // 検索用関数 Function Search_Pattern($record,$pattern) { for($loop = 0;$loop < count($pattern);$loop++) { if($pattern[$loop] == "") continue; if(!ereg($pattern[$loop],$record)) return 0; } return 1; } // メインプログラム if($search) { if(!$keyword) { $error = "キーワードが入力されていません"; $search = ""; } } if($search) { $fp = @fopen("search_csv.csv","r"); if(!$fp) { $error = "該当ファイルを参照できません"; $search = ""; } } </SCRIPT> <HTML> <HEAD> <META Http-Equiv="Content-Type" Content="text/html;charset=EUC-JP"> <TITLE>ファイル簡易検索</TITLE> </HEAD> <BODY> <B>ファイル簡易検索</B> <BR> <CENTER> <FORM ACTION="search_csv.php" METHOD="post"> <INPUT TYPE="hidden" NAME="search" VALUE="検索する"> キーワード: <INPUT TYPE="text" NAME="keyword" VALUE="<? echo $keyword; ?>" SIZE="30"> <INPUT TYPE="submit" NAME="search" VALUE="検索する"> </FORM> <FONT COLOR="#FF0000"><? echo $error; ?></FONT> <HR> <P> <SCRIPT LANGUAGE="PHP"> if($search) { echo "<TABLE BORDER=1>\n"; while(!feof($fp)) { $buff = fgets($fp,255); $title .= $buff; if(ereg("\n",$buff)) break; } $title = ereg_replace("\x0A","",$title); $column = split(",",$title); echo "<TR>\n"; for($loop = 0;$loop < count($column);$loop++) { echo '<TD BGCOLOR="#00FFFF" NOWRAP>',$column[$loop],"</TD>\n"; } echo "</TR>\n"; $keyword = ereg_replace(" "," ",$keyword); $pattern = split(" ",$keyword); while(1) { $line = ""; while(!feof($fp)) { $buff = fgets($fp,255); $line .= $buff; if(ereg("\n",$buff)) break; } if($line == "") break; if(!Search_Pattern($line,$pattern)) continue; $line = ereg_replace("\x0A","",$line); $column = split(",",$line); echo "<TR>\n"; for($loop = 0;$loop < count($column);$loop++) { echo "<TD>",$column[$loop],"</TD>\n"; } echo "</TR>\n"; } fclose($fp); echo "</TABLE>\n"; } else { echo "キーワードを入力し、検索ボタンを押すと検索結果がここに表示されます。\n"; } </SCRIPT> <P> <FONT SIZE=2><I> Copyright (C) 2001-2004 All right reserved by <A HREF="http://cgikon.com">CGI KON</A> </I></FONT> </CENTER> </BODY> </HTML> フリー配布のphpをチェックしているのですが、なぜかこのphpだけ動きません。 csvファイル名もそのままでftpにあげています。 他のphpは問題なくうごいているのですが、原因がわかりません。 ご教授願います。

    • 締切済み
    • PHP
  • phpでフォームの値をフレームに渡す際、&が使えず

    こんにちは。 PHPで、メタサーチのようなものを作ろうと思っています。 まず、検索窓に入力した値をGoogle検索に送り、 iframe内に表示するようにしました。 しかし、「PHP 入門」など、通常のキーワードであればうまくいくのですが、 「P&G」など、「&」が入ると、勝手にアンド検索になってしまい、うまく機能しません。 値の送り方に問題があるのでしょうか? ご教示お願い致します。 search1.php <?php $keyword=$_GET["keyword"]; $keyword4url=urlencode($keyword); ?> <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> </head> <body> <center> <form action="search1.php" method="get"> キーワード:<input type="text" name="keyword" size="20" value="<?php echo $keyword;?>" onfocus="this.select()"> を <input type="submit" value="検索する"> </form> <br> <iframe src="http://www.google.co.jp/#q=<?php echo $keyword; ?>" name="frame1" frameborder="1" scrolling="auto" width="977" height="600"> </iframe> </center> </body> </html>

    • ベストアンサー
    • PHP
  • jQueryでAJAXを利用しJSONデータを取得

    商品コードを入力したら、AJAXで商品名と価格を取得して表示させ、それを確認して個数を入力して注文票を作ろうとしています。 商品名だけの取得は何とかできたのですが、商品名と価格といったように複数データを取得するのに苦労しています。 独学のプログラミングなので初歩的な所が分かっていないのだろうと思いますが、JSON形式で受け取ればいいのだろうと考えて、そうしているのですが、うまくいきません。 下記は、商品名だけなら取得できているコードですが、どこを修正したらいいでしょうか。 よろしくお願いします。 ファイル名:test1.php <html> <head> <title>test</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.2.min.js"></script> <script type='text/javascript'> $(document).ready(function(){ $("#goodsid").keyup(function(e){ var search_val=$("#goodsid").val(); $.post("./SubTest1.php",{search_term : search_val},function(data){$("#goodsname").html(data);}) }) }); </script> </head> <body> <form id="searchform" method="post"> <div> <label>商品番号</label> <input type="text" name="goodsid" id="goodsid" /> </div> </form> <div id="goodsname"></div> <div id="goodsprice"></div> </body> </html> ファイル名:SubTest1.php <?php ini_set("default_charset","utf-8"); // MySQLクラスファイルの取り込みとインスタンスの作成 require_once("../mysql.php"); $mysql = new MySQL; $term = $_POST["search_term"]; $sql = "SELECT goods_name,goods_price FROM `goods_table` WHERE goods_num ='".$term."'"; $mysql->query($sql); $row = $mysql->fetch(); // ここまででデータを取得している if ($row){ $goodsname = $row['goods_name']; }else{ $goodsname = ""; } echo $goodsname; //呼び出し元のtest1.phpに返す値 ?>

  • PHP+MySQLの「データを検索して表示する」について

    名前を入れて検索すると、このように下記の様に表示されてしまいます。 Parse error: syntax error, unexpected '>' in C:\xampp\htdocs\list.php on line 52 検索フォームのsearch.phpは <HTML> <HEAD> <TITLE>検索テスト</TITLE> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </HEAD> <BODY bgcolor="#FFFFFF"text="#000000"> <FONT size="4">検索テスト</FONT> <FORM name="form1" method="post" action="list.php"> 名前;<BR> <INPUT type="text" name="search_key"> <BR> <INPUT type="submit" value="検索"> </FORM> </BODY> </HTML> です。 データ検索のlist.phpは <HTML> <HEAD> <TITLE>検索テスト</TITLE> </HEAD> <BODY> <?php require_once("DB.php"); $dbUser = "sample"; $dbPass = "password"; $dbHost = "localhost"; $dbName = "sampledb"; $dsn = "$dbType://$dbUser:$dbPass@$dbHost/$dbName"; $conn = DB::connect($dsn); //接続にしっぱいしたらメッセージを表示して終了します。 if (DB::isError($conn)) { die($conn->getMessage()); } //POSTされたデータを受け取り、エスケープします。 $search_key =addslashes($_POST['search_key']); $sql = <<<EOS SELECT * FROM member WHERE last_name like'%$search_key%' OR first_name like'%$search_key%' EOS; if(preg_match("/Windows/",$_ENV["OS"])){ $sql = mb_convert_encoding($sql,"SJIS","EUC-JP"); } $result = $conn->query($sql); if (DB::isError($result)) { die($result->getMessage()); } $count = $result->numRows(); print"検索結果は".$count."件です。"<BR>"; if($count>0){ ?> <TABLE width="450" border="1" cellspacing="0" cellpadding="8"> <TBODY> <TR><TH>番号</TH><TH>氏</TH><TH>名</TH><TH>年齢</TH></TR> <?php while($rs = $result->fetchRow(DB_FETCHMODE_ASSOC)) { if(preg_match("/Windows/",$_ENV["OS"])){ $rs['last_name'] = mb_convert_encoding( $rs['last_name'],"EUC-JP","SJIS"); $rs['first_name'] = mb_convert_encoding( $rs['first_name'],"EUC-JP","SJIS"); } ?> <TR><TD align="center"><?=$rs['id']?></TD> <TD><?=$rs['last_name']?></TD> <TD><?=$rs['first_name']?></TD> <TD align="center"><?=$rs['age']?></TD></TR> <?php } $result->free(); $conn->disconnect(); ?> </BODY> </HTML> です。 「速効!図解プログラミングPHP+MySQL」を見ながら、その通りに書いたのですが動きませんでした。 XAMPPを使って作っています。 長々と失礼しましたが、どうか解決策を教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPでTEXTと同様なcheckBoxの処理

    下記のフォームから検索キーワードを入力してANDとORの検索はちゃんとできていますが、 チェックボックスを使いテキストフォームと同様のロジックで「りんご■メロン」と 文字と文字の間にスペース「■」で結合して送信し、PHPコード側で受けとるにはどうしたらよいかアドバイス下さい。 ちなみに、PHPコード側では$_REQUEST['word']に<input type=text name=word size=35 value="">と同じような処理を入れたいです。 (1)検索キーワード --------------------------------------- りんご■メロン *■は半角スペース文字とします。 HTMLフォーム --------------------------------------- <form action="test.php" action="POST"> <input type=hidden name=mode value="search"> 検索キーワード:<input type=text name=word size=35 value=""> <select name=option> <option value="and"> AND</option> <option value="or"> OR</option> </select> <input type=submit value="Search"> </form> ↓この処理では全然だめでした。 <form action="test.php" method="post"> <input type="checkbox" name="word[]" value="りんご"> <input type="checkbox" name="word[]" value="メロン"> <input type=submit value="Search"> </form> PHPコード foreach($_REQUEST['word'] as $val){ $_REQUEST['word'] = " "."$val"; }

    • 締切済み
    • PHP
  • アメリカのAmazon.comについての探し物があ

    http://www.amazon.co.jp/s/ref=nb_sb_noss?__mk_ja_JP=%83J%83%5E%83J%83i&url=search-alias%3Daps&field-keywords=uv+%83J%83b%83g+%83X%83v%83%8C%81%5B+%88%DF%97%DE のような衣類に吹き付けるタイプのUVカットスプレーをamazon.comで探しいるのですがどうしても見つけれません。 英語でどんなキーワードで探せばいいのでしょうか?

  • twitterAPIを利用してツイート一覧を取得

    <?php //twitteroauth.phpを読み込み require_once dirname(__FILE__) .'/twitteroauth.php'; //検索ワード配列 $keyword_list = array("OKWave","yahoo知恵袋"); //最大検索数 $countmax = 10; //twitterAppsで取得 $consumerKey = '*****'; $consumerSecret = '*****'; $accessToken = '*****'; $accessTokenSecret = '*****'; $to = new TwitterOAuth( $consumerKey, $consumerSecret, $accessToken, $accessTokenSecret ); //Twitterで検索するワード //複数の場合はORかANDを使う $key = ""; $size = count($keyword_list); for($i=0;$i<$size;$i++){ $keyword = $keyword_list[$i]; $key .= $keyword; if($i<$size-1){ $key .= " AND "; } } //オプション設定 //countmaxは最大検索数 $options = array('q'=>$key,'count'=>$countmax,'lang'=>'ja'); //検索 $json = $to->OAuthRequest( 'https://api.twitter.com/1.1/search/tweets.json', 'GET', $options ); $jset = json_decode($json, true); //tweetidを取得 foreach ($jset['statuses'] as $result) { //ローマ字の名前 $screen_name = $result['user']['screen_name']; //ユーザーID(数字) $id = $result['user']['id']; //ユーザー名 $name = $result['user']['name']; //ユーザーアイコン画像URL $link = $result['user']['profile_image_url']; //該当ツイート $content = $result['text']; //更新日 $updated = $result['created_at']; $time = date("Y-m-d H:i:s",strtotime($updated)); //不明なものはprint_rで見ればいい //print_r($result); echo "<img src='".$link."''>"." | ".$screen_name." | ".$id." | ".$name." | ".$content." | ".$time." "; } ?> このコードで特定のワードを含んだツイートを取得して【並び替えてから】表示したいのですが、並び替えがうまくできません。 ランダムや新着順、リツイート順などで並び替えることは可能でしょうか。 可能であれば、並び替えの為に必要なコードを教えていただけませんか。

    • ベストアンサー
    • PHP

専門家に質問してみよう