【问题标题】:Encoding json from recursively merged php array从递归合并的php数组编码json
【发布时间】:2017-06-27 07:38:00
【问题描述】:

我正在尝试从一个简单的 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[?] ));

你会怎么做?

【问题讨论】:

    标签: php arrays json encode


    【解决方案1】:

    如果你需要创建这样的元素,这意味着你只需要在循环中合并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"
          }
      }
      

      【讨论】:

      • 你甚至不需要$byteam$country。你可以做unset($row['jsteam']);(可选)然后$arr[$jsteam] = $row;。不过,这是一个很好的答案。
      • 谢谢。我接受 Dolly Aswin 的答案,因为它更接近我想要的。你的回答还是很好用的。
      猜你喜欢
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      相关资源
      最近更新 更多