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

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

ただいまの
回答率

90.34%

  • PHP

    21348questions

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

  • MySQL

    6178questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • phpMyAdmin

    691questions

    phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

取出したMySQLのデータをjson_encodeする時に、階層構造を作りたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 308

oyatsu8

score 69

MySQL,PHP初心者です。phpMyadminから取出したMySQLのデータをjson_encodeする時に、階層構造を作りたいのですが、どうしていいか分かりません。
最初はCONCATを使って、階層の上の部分を追加しようとしたのですが、うまく行かず、
下記のような記事を見つけましたが、丁度この逆のことがしたいと思っています。
アドバイスを頂けたら助かります。

http://pulogu.net/blog/020-computer/php/json-use/

また、そのような事をしたい場合に、ちょうど良い参考書があれば教えて頂けたら助かります。

追記:
回答をありがとうございます。
プログラムは多分全然出来ていないと思いますが追記させて頂きます。
SELECT文の後か前に、PHPで階層を作るようなプログラムにしないといけないと思うのですが
普通はどうやるのかがわかりません。

<?php
function es($str) {
    return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}
//エラー出力強制
ini_set( 'display_errors', 1 );
//すべてのエラー表示
error_reporting( E_ALL );

//データベースへの接続
define('DB_NAME', 'test');
define('DB_HOST', 'test');
define('DB_USER', 'test');
define('DB_PASS', 'test');

$dbName = DB_NAME;

$dsn = 'mysql:dbname=' . DB_NAME . ';host=' . DB_HOST . ';charset=utf8';
$option = array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
    PDO::ATTR_EMULATE_PREPARES => false,
    PDO::ATTR_STRINGIFY_FETCHES => false
);
?>

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>レコードを取り出す(すべて)</title>
</head>
<body>
<div>
  <?php

  //MySQLデータベースに接続する
  try {
    $db = new PDO($dsn, DB_USER, DB_PASS, $option);

    // SQL文を作る(全レコード)

    $sql = "SELECT CONCAT ('aaaaaaaaaaa') FROM test_json";
    //$sql = "SELECT * FROM test_json";

    $res = $db->query($sql, PDO::FETCH_ASSOC);
    $res = $res !== false ? $res : [];
    $result = [];

    foreach($res as $row) {
        $result[] = $row;
    }
   //json
   $json = json_encode($result);

////json書き出し
  $filename = "test_json.json";

  $result = touch($filename);

  if ($result){
    // ファイルに書き出す
    file_put_contents($filename, $json, LOCK_EX);
    echo "{$filename}にデータを書き出しました。", "<hr>";
    echo '<a href="get_contents.php">ファイルを読み込む</a>';
  } else {
    // ファイルエラー
    echo '<span class="error">ファイルに保存できませんでした。</span>';
  }
////json書き出しend

  ?>
</div>
</body>
</html>
  • MySQLのテーブルは階層で作る事は出来ないのでしょうか?

phpMyadminのテーブル:test_json

  • MySQLのテーブルは階層になっていませんが下記のように出力したいと思います。
"type":"type01",
"properties":{
    "properties01":"properties01の内容",
    "properties02":"properties02の内容"
},
"material":{
    "material01":{
        "material01_shop01":"material_shop01の内容",
        "material01_shop02":"material_shop02の内容"
        },
    "material02":{
        "material02_shop01":"material02_shop01の購入先01の内容",
        "material01_shop02":"material02_shop02の購入先02の内容"
        },
},
"id":"0001"
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • oyatsu8

    2017/09/27 10:01

    ありがとうございます、追記しました

    キャンセル

  • yambejp

    2017/09/27 10:07

    テーブルのそれぞれのカラムは、JSONデータのそれぞれ何処にあたるのでしょうか?

    キャンセル

  • oyatsu8

    2017/09/27 14:00

    すみません、内容がずれていました。いま修正しました

    キャンセル

回答 1

checkベストアンサー

+3

おそらくCONCATはしないほうがいいと思います
RDBからの戻りはassocでfetchAllすればスプレッドシート的な
縦×横のデータになるので、組み替えてからjsonエンコードするだけです
組み換えについては元データと結果の提示がないのでなんとも言えません

 sample

/*$aはfetchAllするものとします*/
$a=[
  [
    "type"=>"t_1",
    "properties01"=>"p1_1",
    "properties02"=>"p2_1",
    "material01_shop01"=>"m1s1_1",
    "material01_shop02"=>"m1s2_1",
    "material02_shop01"=>"m2s1_1",
    "material02_shop02"=>"m2s2_1",
    "id"=>"i_1",
    ],
  [
    "type"=>"t_2",
    "properties01"=>"p1_2",
    "properties02"=>"p2_2",
    "material01_shop01"=>"m1s1_2",
    "material01_shop02"=>"m1s2_2",
    "material02_shop01"=>"m2s1_2",
    "material02_shop02"=>"m2s2_2",
    "id"=>"i_2",
    ],
  [
    "type"=>"t_3",
    "properties01"=>"p1_3",
    "properties02"=>"p2_3",
    "material01_shop01"=>"m1s1_3",
    "material01_shop02"=>"m1s2_3",
    "material02_shop01"=>"m2s1_3",
    "material02_shop02"=>"m2s2_3",
    "id"=>"i_3",
    ],
  ];
$b=[];
foreach($a as $key=>$val){
  $b[$key]["type"]=$val["type"];
  $b[$key]["properties"]=[];/*空配列は宣言しなくてもOKだが念の為*/
  $b[$key]["properties"]["properties01"]=$val["properties01"];
  $b[$key]["properties"]["properties02"]=$val["properties02"];
  $b[$key]["material"]=[];
  $b[$key]["material"]["material01"]=[];
  $b[$key]["material"]["material01"]["material01_shop01"]=$val["material01_shop01"];
  $b[$key]["material"]["material01"]["material01_shop02"]=$val["material01_shop02"];
  $b[$key]["material"]["material02"]=[];
  $b[$key]["material"]["material02"]["material02_shop01"]=$val["material02_shop01"];
  $b[$key]["material"]["material02"]["material02_shop02"]=$val["material02_shop02"];
  $b[$key]["idl"]=$val["id"];
}
print_r(json_encode($b, JSON_PRETTY_PRINT));

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/27 10:02

    ありがとうございます。追記しました。どのように取出したDBデータを階層に変形?するかがわからないです。

    キャンセル

  • 2017/09/27 14:18

    sample追記しました
    DBからうけとった配列$aを整形用に$bに変換してjson_encodeしておきました

    キャンセル

  • 2017/09/27 14:30

    大変ありがとうございます!!!!
    多分エンジニアの方には日常的にありそうな作業だと思うのですが、このような方法はどこで学習したらいいのかわかりませんでした。

    キャンセル

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

  • PHP

    21348questions

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

  • MySQL

    6178questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • phpMyAdmin

    691questions

    phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。