从递归合并的 php 数组编码 json

Encoding json from recursively merged php array

我正在尝试从一个简单的 mysqli_query 制作一个 .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"}}]

我不喜欢字符串开头和结尾的 [] 部分。如果我按如下方式更改这行代码:

$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[?] ));

你会怎么做?

如果你需要创建这样的元素,这意味着你只需要合并 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() 将覆盖现有数组。

我认为你根本不需要数组。我模拟了你的数据流和编码:

$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"
    }
}