2013-10-16 95 views
0

這個問題已經被問過了,但是沒有機構回答我的猜測。將從mysql查詢返回的數據轉換爲json(基於樹)

比方說MySQL查詢返回結果就像下面

name | id 
tarun | 1 
tarun | 2 
tarun | 3 

現在,如果我們這樣做的標準JSON編碼,我會得到一些東西象下面這樣:

[{"name":"tarun","id":"1"},{"name":"tarun","id":"2"},{"name":"tarun","id":"3"}] 

但我是輸出類似下面

[{"name" : "tarun", "ids" : [{"id": "1"},{"id": "2"},{"id": "3"}]}] 

請忽略我的語法錯誤(如果有的話),但我希望我的疑問句是有道理的。 我使用PHP作爲我的後端腳本語言。

回答

1

你可能做這樣的事情

SELECT name, id FROM ... 

$data = array(); 
while ($row = mysql_fetch_assoc($result)) { 
    $data[] = $row; 
} 

根據您期望的結構,你會希望

$data[$row['name']]['ids'][] = array('id' => $row['id']); 

這不會給你確切的結構,但它會將所有ID作爲子陣列放置在由tarun字段val UE。

0

擴展@Marc B的答案

// Getting per person id's list 
$people = array(); 
while ($row = mysql_fetch_assoc($result)) { 
    $people[$row['name']][] = array('id' => $row['id']); 
} 

// Encoding as JSON 
$output = "["; 

foreach ($people as $name => $ids) { 
    $output .= '{"name" : "'.$name.'", ids: ['; 
    foreach ($ids as $key => $id) { 
     $output .= '{"id" : "'.$id.'"},'; 
    } 
    rtrim($output, ","); 
    $output .= ']},'; 
} 
rtrim($output, ","); 
$output .= ']'; 

echo $output; 

上面的解決方案是專門針對這個問題。在我看來,針對此問題的通用JSON編碼方法非常困難或不可行。

0

我建議使用orderying按名稱進行查詢,然後當您讀取行時,只需執行一次簡單的檢查以查看$ row ['name']是否已更改,如果是這樣,則將已收集的id添加到php對象。

$curName=""; 
$curIds=array(); 
$betterJ=array(); 
$result = mysql_query ("SELECT name,id FROM mytable WHERE 1 ORDER BY NAME); 
while($row=mysql_fetch_array($result) 
{ 
    if($curName=="") 
     $curName=$row['name'] 

    if($row['name']!=$curName){ 
     $betterJ[]=array($name=>$curName,$ids=>$Ids) 
     $curName=$row['name'] 
     $curIds=array() 
    } 
    $Ids[]=$row['id]; 
} 
$betterJ[]=array($name=>$curName,$ids=>$Ids); 
echo json_encode($betterJ); 

這可能有一個錯字或東西,因爲我在這裏寫的,但它應該產生像

[ [name:"tarus1",ids:[1,2,3]], [name:"tarus2",ids:[4,5,6], ... ] 

JSON,你會在HTML等在模板中工作的偉大