2017-06-27 38 views
1

.jsonファイルを単純な0​​から作成しようとしています。私はこれを試してみた:再帰的に結合されたphp配列からjsonをエンコードする

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

私はbegginingでとで[]の事を好きではない:

$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の結果は、(最初​​の2つの要素)は次のようですストリングの終わり。私はこのコード行を変更する場合は、次のように:

$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を作ることができないということです2番目の形式では、クエリから得られる結果の数がわからないためです。それは次のようになります:

$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

ありがとうございます。私が探していたものにもっと近いので、私はDolly Aswinの答えを受け入れます。あなたの答えはまだ非常に良くて便利です。 – Javi

関連する問題