PHP関数化:jsonファイルを読み込み連想配列に変換する

このQ&Aのポイント
  • PHP関数化を試みる際、jsonファイルを読み込み連想配列に変換する方法についてわからない。
  • 初心者なので基本的なことかもしれないが、ファイルの存在を確認し、jsonデータを読み込んで連想配列に変換したい。
  • 特定の要素にアクセスするためには、連想配列であることを考慮に入れる必要がある。
回答を見る
  • ベストアンサー

PHP 関数化

失礼します。今回関数化をしたいのですが、うまくできません 内容はjsonファイルを読みこみ連想配列に変換したいです。 当方PHP初心者なので当たり前の事かもしれませんが宜しくお願い致します。 function Array_trans_json($file_path,$json_arr){ $json = file_get_contents($file_path); //jsonデータを読み込む $json = mb_convert_encoding($json,'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN'); //文字化けを防ぐ //$json_arr["piyo"][control_num];でアクセスできる $json_arr = json_decode($json,true); //jsonデータを連想配列に変換 } $file_path = "./test.json"; if(file_exists($file_path)){ $json_arr; Array_trans_json($file_path,$json_arr);

  • PHP
  • 回答数3
  • ありがとう数2

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

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

関数にするというのなら、関数の処理結果を返すようにしたらいいのではないでしょうか。 こんなイメージ。動作確認はしていませんが、方向性はそれでいいはず。 function Array_trans_json($file_path) { $json = file_get_contents($file_path); //jsonデータを読み込む $json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN'); //文字化けを防ぐ //$json_arr["piyo"][control_num];でアクセスできる $json_arr = json_decode($json, true); //jsonデータを連想配列に変換 return $json_arr; } $file_path = "./test.json"; if(file_exists($file_path)){ $json_arr = Array_trans_json($file_path);

その他の回答 (2)

  • t_ohta
  • ベストアンサー率38% (5078/13272)
回答No.3

No.1 の方が書かれている通り、関数は returnで 値を返すのが基本なので、 function Array_trans_json($file_path,$json_arr){ は function Array_trans_json($file_path){ とし $json_arr = json_decode($json,true); //jsonデータを連想配列に変換 は return json_decode($json,true); //jsonデータを連想配列に変換 とします。 そして呼び出し側は $json_arr = Array_trans_json($file_path); とするのが正しい対処法です。 何らかの理由で戻り値として値を受け取るのでは無く、引数で変数を渡して中に入れてもらう必要があるのであれば、関数の定義で引数を参照渡しにする必要があります。 その場合は、 function Array_trans_json($file_path,&$json_arr){ とします。

  • akauntook
  • ベストアンサー率19% (295/1481)
回答No.1

私は、技術者向けって書いてあるのに、初心者です。と断りを入れるのは嫌いですが、たまたま気が向いたので回答します。 関数は、与えられた引数により、なにかを返すものです。 書式としては、 function 関数名(引数1,引数2,…){ 処理の記述 return 戻り値; } です。 phpに限ることではないですが、基本的に関数は、引数を変更しない。 二次関数とか、中学生のときにやったことと変わりません。 xの値が決まるとyが決まる。そんだけです。 この場合、xが引数でyが戻り値と等しくなるってことですね。 returnがないんで、その関数は何も値を返さない。 質問に書いてある認識の時点で間違いだとわかります。 >内容はjsonファイルを読みこみ連想配列に変換したいです。 概ねこの通りに書いてあると思います。 やりたいことを正しく書くなら jsonファイルのパスを引数にとり、ファイルの内容を配列で返す関数になります。 とりあえず、簡単にこんなところです。 『php ユーザー定義関数』等と検索することで、小学生レベルの算数を例にして説明しているサイトもあるんで、それ見ればわかるはずです。 phpは情報も多いので、かなり学習しやすいと思います。 何よりマニュアルが分かりやすい。 入門的なサイトをまずは一通り実例を自分で試して、さらにマニュアルで必要な関数を確認すれば、問題ないと思います。

losloson
質問者

お礼

ありがとうございます。

関連するQ&A

  • 連想配列でこういう処理をする関数を探しています

    PHP5.2.4を使用しています。 どういうふうに説明してよいのか分かりませんが、 $arr = array(  'key1' => array('value1'=>1,'value2'=>11),  'key2' => array('value1'=>2,'value2'=>22),  'key3' => array('value1'=>3,'value2'=>33), ); という連想配列を例えばキー'value2'の値だけが欲しく、 $arr = array(  'key1' => 11,  'key2' => 22,  'key3' => 33, ); と、変換したいのですが、そのような関数はあるのでしょうか? またこのような処理をする関数を自作する場合、 どのような関数名が適切でしょうか?(array_○○○)

    • ベストアンサー
    • PHP
  • 配列のlengthの意味

    配列を作って以下のように作りました。 ==================================== var arr:Array = new Array(); arr[0] = "地球"; arr[1] = "太陽"; arr[2] = "月" arr["川"] = "rever"; arr["魚"] = "fish" arr["鳥"] = "bird"; trace(arr[0]);  //結果: 地球 trace(arr["魚"]);  //結果: fish trace(arr.length);  //結果: 3 →なぜ6ではない? ==================================== 連想配列3つと、普通の3つの2種類を arrという配列に入れたのですが、 lengthを調べると 3 と出ます。 連想配列というのは、 length には反映されないのでしょうか。 またその場合、連想配列の個数を調べるときは どのように書けばよいのでしょうか。 連想配列って、配列のどこに格納されているのだろう。。? と不思議に思ってしまいます。 ご存知の方いらっしゃいましたら、 何卒よろしくおねがいいたします。

    • ベストアンサー
    • Flash
  • PHPでJSONを扱うときに配列の参照について

    Web ad Fortune http://jugemkey.jp/api/waf/api_free.php という占いのAPIをPHPにて使おうと思い、 JSON形式で情報が帰ってくるようなので JSONについて調べて json_decode()関数を使うことにしました。 しかし、いまいち配列からのデータ参照ができません。どういうことかというと、 牡羊座のランクを取り出したいときに 【ソース】 <?php $json = file_get_contents("http://api.jugemkey.jp/api/horoscope/free/2009/02/27","r"); $obj = json_decode($json); echo "<pre>"; print_r($obj->horoscope->2009/02/27[0]["rank"]); echo "</pre>"; ?> としても何も表示されません。 ちなみに、print_rの部分を print_r($obj->horoscope); とすると http://nanigashi.biz/json.php のように表示されます。 配列からの情報の読み込み(データ参照)がわかりません。 教えてください。

    • ベストアンサー
    • PHP
  • PHP の array_filter() 関数

    お世話になります。 array_filter() 関数の使い方を練習していて、ネットからダウンロードしたJSON形式のアメリカ映画の情報を使った簡単なコードを書いてみました。この中から特定の情報、下に添付した例では、"acttor_1" というキーの値が 'Sean Connery' という俳優に関する情報を取得することができるのですが、添付のスクリーンショットにあるように、'actor_1' というキーが未定義であるとのエラーメッセージが出ます。 スクリプトの下にありますように、このデータの中にはちゃんと 'actor_1' というキーが存在しています。 このようなエラーメッセージが出るのはなぜでしょうか? 詳しい方にご説明いただけたら有難く思います。 どうぞよろしくお願いいたします。 「自分のスクリプト」 <?php $json = file_get_contents('./film_locations.json'); $data = json_decode($json, true); $search = 'Sean Connery'; $filtered = array_filter($data, function($item) use ($search) { return $item['actor_1'] == $search; // return (stripos($item['actor_1'], $search) !== false); } ); echo "<pre>"; print_r($filtered); echo "</pre>"; 「JSON形式からPHPの連想配列に変換したものの最初の2例」 Array ( [0] => Array ( [title] => Experiment in Terror [release_year] => 1962 [locations] => The Sea Captain's Chest (Fisherman's Wharf) [production_company] => Columbia Pictures Corporation [distributor] => Columbia Pictures [director] => Blake Edwards [writer] => The Gordons [actor_1] => Glenn Ford [actor_2] => Lee Remick [actor_3] => Stefanie Powers [:@computed_region_6qbp_sg9q] => 99 [:@computed_region_ajp5_b2md] => 23 [:@computed_region_26cr_cadq] => 3 ) [1] => Array ( [title] => Experiment in Terror [release_year] => 1962 [locations] => 100 St. Germain Avenue [production_company] => Columbia Pictures Corporation [distributor] => Columbia Pictures [director] => Blake Edwards [writer] => The Gordons [actor_1] => Glenn Ford [actor_2] => Lee Remick [actor_3] => Stefanie Powers [:@computed_region_6qbp_sg9q] => 47 [:@computed_region_ajp5_b2md] => 38 [:@computed_region_26cr_cadq] => 8 ) 以上です。

    • ベストアンサー
    • PHP
  • php初心者です。宜しくお願い致します。

    php初心者です。宜しくお願い致します。 動作環境はwindowsXPです。 windows上に配置された日本語のファイル名を持つファイルをphpから処理したいと思っています。 たとえば、 if (!file_exists(mb_convert_encoding($path_file,"SJIS","auto"))) {・・・というようにまずファイル存在チェックを行うなど。 上記例では$path_fileはUTF-8で格納しているため、windowsに合わせSJISにエンコーディングしています。 $path_fileにはフルパスを指定し、大抵の日本語ファイルは読み込めるのですが、いわゆる5C問題に該当する、「表紙.pdf」「予定.txt」など、特定文字を含む日本語ファイル名が読めません。上記file_existsを行うと、存在するのに「存在しない」と判定されてしまいます。 不思議なのは、scandirして指定フォルダ内全てのファイル名を一括取得し配列へSJISで格納した後、そのまま配列の値をもってfile_existsしてみると、上記特定文字を含む日本語ファイル名だけ「存在しない」と判定されてしまいます。 ちなみにscandirした結果をUTF8に変換しブラウザに表示させてみると「表紙.pdf」「予定.txt」と正しく表示され、「表\紙.pdf」「侮・.pdf」等のように化けないです。 php.iniの「magic_quotes_gpc」はOffとなっています。 file_existsだけでなく、fopen、readfileなど含め、正しく処理できるようにするためにはどうすればよいのでしょうか、ご教授いただけると幸いです。

    • 締切済み
    • PHP
  • PHPに関する質問です。

    PHPに関する質問です。 データベースからfetchしたデータを 10件づつとりだしグループ化して、最後の残りが8件以下の場合は、各グループの配列の先頭に加えるという処理を行う際に、このような記述をしているのですが、 $data = array(); // 保存する配列 $ct1 = 0; $ct2 = 0; while($row = $res->fetch(PDO::FETCH_NUM)) { if ($ct2 === 10) { $ct1++; $ct2 = 0; } if ($ct2 === 0) { $data[$ct1] = array(); } $data[$ct1][] = $row; $ct2++; } if (count($data[$ct1]) < 8) { $arr = array_pop($data); $x = floor(count($arr) / count($data)); // 各要素に割り当てる数 for ($i = 0; $i < count($data); $i++) { for ($j = 0; $j < $x; $j++) { array_push($data[$i], array_pop($arr)); } } $t = 0; while (count($arr) > 0) { // 最後のあまりを先頭に追加 array_push($data[$t], array_pop($arr)); $t++; } } この処理だと、生成された配列が3次元になってしまいます。 Array ( [0] => Array ( [0] => Array ( [0] => あ ) [1] => Array ( [0] => あ) [2] => Array ( [0] => あ) [3] => Array ( [0] => あ) [4] => Array ( [0] => あ) [5] => Array ( [0] => あ ) [6] => Array ( [0] => あ ) [7] => Array ( [0] => あ) [8] => Array ( [0] => あ ) [9] => Array ( [0] => あ ) [10] => Array ( [0] => あ) ) [1] => Array ( [0] => Array ( [0] => あ) [1] => Array ( [0] => あ) [2] => Array ( [0] =>あ ) [3] => Array ( [0] => あ ) [4] => Array ( [0] => あ ) [5] => Array ( [0] => あ ) [6] => Array ( [0] => あ) [7] => Array ( [0] => あ ) [8] => Array ( [0] => あ ) [9] => Array ( [0] => あ ) [10] => Array ( [0] => あ ) ) [2] => Array ( [0] => Array ( [0] => あ ) [1] => Array ( [0] => あ) [2] => Array ( [0] => あ ) [3] => Array ( [0] => あ ) [4] => Array ( [0] => あ) [5] => Array ( [0] => あ ) [6] => Array ( [0] => あ ) [7] => Array ( [0] => あ ) [8] => Array ( [0] => あ ) [9] => Array ( [0] => あ) [10] => Array ( [0] => あ ) ) [3] => Array ( [0] => Array ( [0] => あ ) [1] => Array ( [0] => あ ) [2] => Array ( [0] => あ ) [3] => Array ( [0] => あ ) [4] => Array ( [0] => あ ) [5] => Array ( [0] => あ) [6] => Array ( [0] => あ ) [7] => Array ( [0] => あ ) [8] => Array ( [0] => あ ) [9] => Array ( [0] => あ) ) ) これを array([0]=>array(あ,あ,あ,あ,あ,あ,あ)[1]=>array(あ,あ,あ,あ,あ,あ,あ)) のように2次元で取り出すには、どのように行えばいいでしょうか。 この後の処理としては、 $key = 'a'; array_search($key,$data) のようにキーを取得したいと考えています。 宜しくお願いします。

    • 締切済み
    • PHP
  • PHPからJavaScriptの指定形式へ変更

    PHPからJavaScriptの下記形式へ変更したいのですが、これは何と言う形式なのでしょうか? ・json? ・それともJavascriptオブジェクト? ■変更したいavaScript形式 [  ['hoge', 4.3],  ['piyo', 5.6] ], ■変更元のPHPデータ Array (  [0] => 'hoge',4.3  [1] => 'piyo',5.6 )

  • PHP 配列について

    PHPで簡単なプログラムを作っています。 上手い方法があれば教えてください。 例えば $arr = array(); $arr(0) = "ABC"; $arr(1) = "DEF"; $arr(2) = "GHI"; $arr(3) = "JKL"; $arr(4) = "MNO"; この様な配列があり、これを以下の様に「特定のデータを削除し空いているキーを詰めたい」場合どうしたら良いのでしょうか? この場合は"DEF"を削除。 $arr(0) = "ABC"; $arr(1) = "GHI"; $arr(2) = "JKL"; $arr(3) = "MNO"; アドバイスお願いします。

    • ベストアンサー
    • PHP
  • jquery PHP 値 ajax

    失礼します。現在jqueryで作成した2次元配列をPHP側に渡したいのですが上手くいきません。 jquery側のコンソールで確認した際にはsuccessの処理が行われ配列の中身がjson形式で表示されるのですが、その内容をPHP側で確認しようとするとNULLが返ってきてしまいます。 何卒ご教授よろしくお願いいたします。 html側 $(function(){ // 送るデータ形式はJSONでなければ、PHP側でエラーが出る.のでJSON.stringify()でJSON形式に変換 send_data= JSON.stringify(data); // 送信処理 $.ajax({ url: "ajax.php", // 送信先のPHP type: "POST", // POSTで送る contentType: "Content-Type: application/json; charset=UTF-8", //必須ではなさそうだが、サーバ側との整合のために明示しておいた方がよい。 // dataType: 'json', //受信形式 必須ではなさそうだがサーバ側との整合のために明示しておいた方がよい。 data:send_data //JSON形式の送信データ }).success(function(data, status, xhr) { // 通信成功時の処理 console.log("success"); console.log("data ="+data); console.log("status ="+status); console.log("xhr ="+xhr); }).error(function(xhr, status, error) { // 通信失敗時の処理 console.log("error"); }).complete(function(xhr, status) { // 通信完了時の処理 console.log("fin"); }); }) }) PHP側 二通り試してみました。 <?php //php://inputはPOSTの生データを取得できる $json = file_get_contents("php://input"); //JSON形式データをPHPの配列型に変換 $data = json_decode($json); var_dump($data) ; //POSTできたデータを格納 $hoge = $_POST['data']; var_dump($hoge);

    • ベストアンサー
    • AJAX
  • なぜ、この場面で、ループ関数が必要なのでしょうか!

    プログラムレベルは下の下です。  以下のHPはhtmlとphpプログラムのコラボレです。  "表示"タグをクリックすれば、  "Google" "Yahoo" " CBS News" "abc NEws" のタグが出てきて、クリックすれば、ホームページが見れるという  単純なHPです。  そこで、分からに事があります。 sample6.htmlの中に"for"関数がありますが、ループ関数が使われています。 このプログラムのからくりを勉強中ですが、現在ループでつまづいています。_ _  なぜ、この場面で、ループ関数が必要なのでしょうか!?  以下プログラムです、宜しくお願いします。  ファイル名:sample6.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>配列とJSON</title> <script type="text/javascript" src="../lib/jquery-1.8.1.min.js"></script> <script type="text/javascript"> $(function (){ $("#exe").click(hello); }); function hello(){ $.get("sample6.php", {}, function(resp){ var json = eval(resp); var tags = ""; for (var i = 0; i < json.length; i++) { if(i==0){ tags +="<div>サーチ&ポータル</div>"; }else if(i==2){ tags +="<br/><div>USニュースサイト </div>"; } tags += '<a href="' + json[i].url + ' "> ' + json[i].name + '</a><br/>'; } $("#show").html(tags); }); ;} </script> </head> <body> <h2>配列、連想配列とJSON <input type="button" id="exe" value="表示 "/><h2> <p id="show"></p> </body> </html> ファイル名:sample6.php <?php $arr[0]["name"] = "Google"; $arr[0]["url"] = "http://www.google.co.jp/"; $arr[1]["name"] ="Yahoo!"; $arr[1]["url"] = "http://www.yahoo.co.jp/"; $arr[2]["name"] = "CBS News"; $arr[2]["url"] = "http://www.cbsnews.com/"; $arr[3]["name"] ="abc News"; $arr[3]["url" ]= "http://abcnews.go.com/"; header("Content-Type: text/javascript; charset=utf-8"); echo json_encode($arr); ?>

専門家に質問してみよう