MySQL使用PHP将结果转换为JSON


MySQL results to JSON with PHP

我在这里看到了很多类似的问题,但我没能得到我想要的输出。有人能帮帮我吗?如何生成以下JSON结构?我的查询很好,只是不知道如何循环并获得它。感谢

期望输出

{
    "players": [
        {
            "id": 271,
            "fname": "Carlos",
            "lname": "Beltran",
            "position": "OF",
            "stats": [
                {
                    "year": "2010",
                    "hr": 32,
                    "rbi": 99,
                    "team": "NYM"
                },
                {
                    "year": "2011",
                    "hr": 35,
                    "rbi": 100,
                    "team": "STL"
                }, 
                {
                ............
                }
            ]
        },
        {
          ........
        }
    ]
}

电流输出

{"0":{"cbs_id":"18817","fname":"Carlos","lname":"Beltran"},"stats":[{"year":"2007","hr":"33","rbi":"112"}]}
{"0":{"cbs_id":"174661","fname":"Willie","lname":"Bloomquist"},"stats":[{"year":"2007","hr":"2","rbi":"13"}]}
{"0":{"cbs_id":"1208693","fname":"Brennan","lname":"Boesch"},"stats":[{"year":"2010","hr":"14","rbi":"67"}]}

它是用以下内容生成的:(我知道我离很远)

if ($result = mysqli_query($link, $sql)) {
        $player = array();
        while ($row = $result->fetch_assoc())
        {
            $player[] = array (
            'cbs_id' => $row['cbs_id'],
            'fname' => $row['fname'],
            'lname' => $row['lname']
            );
            $player['stats'][] = array(
                'year' => $row['year'],
                'hr' => $row['hr'],
                'rbi' => $row['rbi']
            );
        }
        $json = json_encode($player);
        echo "<pre>$json</pre>";
        mysqli_free_result($result);
    }
}

注:每个玩家可以有多个"统计"记录(年份、小时、rbi等)

这可能会提供您想要的:

$players = array();
while ($row = $result->fetch_assoc())
{
  $id = (int)$row['cbs_id'];
  if ( ! isset($players[$id]))
  {
    // New player, add to $players array.
    // For the moment index players by ID so stats can be easily added
    // to an existing player. Without indexing (using $players[] = ...),
    // the same player would be added for each stats record related to
    // him.
    $players[$id] = array(
      'id'       => $id,
      'fname'    => $row['fname'],
      'lname'    => $row['lname'],
      'stats'    => array()
    );
  }
  // Add the stats
  $players[$id]['stats'][] = array(
    'year' => (int)$row['year'],
    'hr'   => (int)$row['hr'],
    'rbi'  => (int)$row['rbi']
  );
}
// Players are indexed by their ID in $players but need to be contained in
// a JSON array, so use array_values() to remove indices, e.g. convert
//
//     array(
//       271 => array('id' => 271, ...),
//       ...
//     )
//
// to
//
//     array(
//       array('id' => 271, ...),
//       ...
//     )
//
$data = array('players' => array_values($players));
$json = json_encode($data);

最后,您可能会省去整数强制转换,并让PHP通过使用MYSQLI_OPT_INT_and_FLOAT_INNATIVEMYSQLI连接选项自动将字符串化的数字数据(这是MySQL查询结果的默认行为)转换回PHP数字,如本页示例#5所述。请注意,它要求PHP使用mysqlnd库(您可以使用phpinfo进行检查)。

您需要一个关联数组。这样的东西应该会让你开始:

$data = array(
    'players' => array(
        array(
           'id' => 271,
           'fname': 'Carlos',
           'lname': 'Beltran',
           'position': 'OF',
           'stats' => array(
               array(
                   'year' => 2010,
                   'hr': 32,
                   'rbi': 99,
                   'team': 'NYM'
               ),
               ...
           )
        ),
        ...
    )
);

要将其编码为json,请使用json_encode:

$json = json_encode($data);