2017-06-27 60 views
1

我試圖從簡單的mysqli_query製作.json文件。我已經試過這樣:從遞歸合併的php數組編碼json

$res=mysqli_query($link, "SELECT * FROM Teams"); 
$i=0; 
while ($row =mysqli_fetch_assoc($res)) { 
    $jshteam[$i]=$row['shteam']; 
    $jbyteam[$i]=$row['byteam']; 
    $jcountry[$i]=$row['country']; 
    $arrteams[$i]= array("".$jshteam[$i].""=>"country"=>"".$jcountry[$i]."","byteam"=>"".$jbyteam[$i].""]);  
    $i++; 
} 
$json_data= json_encode(array_merge_recursive($arrteams)); 
file_put_contents('json/teams.json', $json_data); 

做這件事時,的teams.json結果如下(前兩個元素):

[{"TEA":{"country":"Turkey","byteam":"TeamName1"}},{"VIS":{"country":"Germany","byteam":"TeamName2"}}] 

我不會在beggining和喜歡的東西[]字符串的結尾。如果我改變這一行我的代碼如下:

$json_data= json_encode(array_merge_recursive($arrteams[0],$arrteams[1])); 
file_put_contents('json/teams.json', $json_data); 

...然後我得到正是我想要的:

{"TEA":{"country":"Turkey","byteam":"TeamName1"},"VIS":{"country":"Germany","byteam":"TeamName2"}} 

的問題是,我不能手動使array_merge_recursive,如在第二種形式中,因爲我不知道查詢有多少結果。它會是這樣的:

$json_data= json_encode(array_merge_recursive($arrteams[0],$arrteams[1],$arrteams[2]....$arrteams[?])); 

你會如何做到這一點?

回答

2

如果你需要創建這樣的元素,這意味着你只需要合併內部循環中的array。這裏我給出一個示例代碼就可以實現

$data = []; 
while ($row =mysqli_fetch_assoc($res)) { 
    . 
    . 
    . 
    . 
    $data = array_merge($data, $arrteams[$i]); 
    $i++; 
} 

$json_data= json_encode($data); 

但是,你必須考慮當arrays具有相同的密鑰(eg: VIS, TEA),array_merge()將覆蓋現有的陣列。

2

我不認爲你需要數組。我做了這個模擬的數據流和編碼:

$arr = []; 
$rows = [ 
    ["jsteam" => "TEA" , "byteam" => "TeamName1" , "country" => "Germany"] , 
    ["jsteam" => "VIS" , "byteam" => "TeamName2" , "country" => "Finland"] 
]; 
foreach ($rows as $row) { 
    $jsteam   = $row["jsteam"]; 
    $byteam   = $row["byteam"]; 
    $country   = $row["country"]; 
    $arr [ $jsteam ] = ["country" => $country , "byteam" => $byteam]; 
} 

$json = json_encode($arr , JSON_PRETTY_PRINT); 
$log->info("\n$json"); 

得到這個在日誌中:

2017-06-27T04:08:16-04:00 cli.TestSomething INFO 
{ 
    "TEA": { 
     "country": "Germany", 
     "byteam": "TeamName1" 
    }, 
    "VIS": { 
     "country": "Finland", 
     "byteam": "TeamName2" 
    } 
} 
+1

你甚至都不需要'$ byteam'和'$ country'。你可以執行unset($ row ['jsteam']);'(可選)然後'$ arr [$ jsteam] = $ row;'。不過,這是一個很好的答案。 – axiac

+0

謝謝。我接受多莉阿斯溫的答案,因爲它更接近我所尋找的。你的答案仍然非常好,很有用。 – Javi