2016-12-09 11 views
0

私は名前、親、および以下に示さMySQLのデータから、子どもたちの形でオブジェクトのJSON配列を生成しようとしています。 REMアルバムのための同じ構造を持つネストされたJSON PHP配列

[{"name":"Abbey Road","parent":"Beatles","children":[{"name":"Come Together","parent":"Abbey Road"}, {"name":"Something","parent":"Abbey Road"},{"name":"Maxwell","parent":"Abbey Road"}, {"name":"Oh! Darling","parent":"Abbey Road"}]}] 

Sample Table from mySQL

理想的には私の出力は次のようになります。

[{"name":"Abbey Road","parent":"Beatles","children":[{"name":"Come Together","parent":"Abbey Road"}]},{"name":"Accelerate","parent":"REM","children":[{"name":"Living Well","parent":"Accelerate"}]}] 

構造は動作しますが、私は、データベースから1つのレコードを返しています:

は今のところ、私はこれを取得することができるだけです。ここで

は、単一のレコード・リターンを生成PHPで私のコードです:

$results_select = mysql_query("SELECT album_table.album , album_table.artist, album_table.year, 
tracks_table.track 
FROM album_table 
JOIN tracks_table ON tracks_table.album = album_table.album"); 


while ($row = mysql_fetch_array($results_select)) { 

      if (!isset($info[$row['album']])) { 
       $info[$row['album']] = array(
        'name' => $row['album'], 
        'parent' => $row['artist'], 
        'children' => array(['name' => $row['track'], 
             'parent' => $row['album'] ]) 
     ); 
     } 

} 
$data = json_encode(array_values($info)); 
echo $data; 

私はちょうど私のPHPコードで複数のレコードを返すことができれば、私は、解決策に非常に近い午前のように私は感じます。

おかげであなたが提供することができます任意の指導のために非常に多くの!

+0

あなたがやっていることを停止し、再びやり直します。非推奨であり、5年間サポートされていないデータベースAPIを使用しています。代替手段は、10年間利用可能である。 http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php – miken32

+0

また、あなたが表示されたコードは、あなたが取得していると主張出力にはなりません。あなたのコードは、JSON配列ではなくJSONオブジェクトとして終わる連想配列を生成します。 – miken32

+0

こんにちは@tomishあなたはこの問題を解決しましたか?私は –

答えて

0
$familys = [] 
while ($row = mysql_fetch_array($results_select)) { 

if (!isset($info[$row['album']])) 
    $familys[ $row['album'] ][ $row['artist'] ][] = ['name' => $row['track'], 'parent' => $row['album'] ]; 
} 

//I think the familys is ok, if you want to make you info format: uncomment below code 
/* 
foreach($familys as $album => $family) 
{ 
    foreach($family as $parent => $children) 
    { 
    $info[$album] = array(
        'name' => $album, 
        'parent' => $parent, 
        'children' => $children 
    } 
} 
*/ 
+0

こんにちはクリス、おかげで、私はこれにいくつかの光の編集とのショットを与えました{"name": "Beatles"}、{"name": "Something"、 "parent": "Beatles"}、{"name": "Maxwell" "親": "ビートルズ"}、{"名前": "ああダーリン"、 "親": "ビートルズ"}}}、{"加速":[{"名前" "REM"}、{"name": "Man-Sized"、 "parent": "REM"}、{"name": "Supernatural" – tomish

+0

まだそれが動作するように取得することができませんでした:私は私のDBであなたと同じだ、唯一の子供のレコードショー – tomish

+0

[{ "修道院で終わる、 – tomish

0

データベースコードを変更する必要があります。PDOを使用することをおすすめします。あなたは、配列を書き換える代わりに$array[]構築物で、それに追加して、あなたのコードのすべてのループで

。これはうまくいくはずですが、微調整が必​​要な場合があります。

<?php 
$dsn = "mysql:host=localhost;dbname=testdb;charset=utf8"; 
$db  = new PDO($dsn, $username, $password); 
$sql = "SELECT album_table.album, artist, year, track FROM album_table LEFT JOIN tracks_table USING (album)"; 
$result = $db->query($sql); 

while ($row = $result->fetch(PDO::FETCH_ASSOC)) { 
    if (!isset($info[$row["album"]])) { 
     $info[$row["album"]] = [ 
      "name"  => $row["album"], 
      "parent" => $row["artist"], 
      "children" => [], 
     ]; 
    } 
    $info[$row["album"]]["children"][] = [ 
     "name" => $row["track"], 
     "parent" => $row["album"], 
    ]; 
} 

$data = array_values($info); 
header("Content-Type: application/json"); 
echo json_encode($data); 

子ノードに親ノードからの値を含めるのは冗長なようです。ところで、2人のアーティストが同じ名前のアルバムを出すときはどうしますか?

関連する問題