从递归合并的 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"
}
}
我正在尝试从一个简单的 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"
}
}