2012-07-21 41 views
1

我在这里看到了很多类似的问题,但我一直无法得到我想要的结果。有人可以帮我吗?如何生成以下JSON结构?我的查询很好,我只是不知道如何循环,并得到这个。由于对PHP的JSON MySQL结果

所需的输出,其与产生

{ 
    "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); 
    } 
} 

注意:每个玩家可以有更多的一个“统计”记录(年,hr,rbi等)

+3

请不要在新代码中使用'mysql_ *'函数。他们不再被维护,社区已经开始[弃用流程](http://goo.gl/KJveJ)。请参阅[**红框**](http://goo.gl/GPmFd)?相反,您应该了解[准备好的语句](http://goo.gl/vn8zQ)并使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli的)。如果你不能决定,[本文](http://goo.gl/3gqF9)将有助于选择。如果你关心学习,[这里是很好的PDO教程](http://goo.gl/vFWnC)。 – 2012-07-21 20:33:17

+0

@Truth感谢您的信息 – relyt 2012-07-21 20:43:31

回答

3

这可能给你想要的东西:

$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自动转换字符串化的数值数据(这是MySQL查询结果的默认行为s)返回到PHP编号通过使用MYSQLI_OPT_INT_AND_FLOAT_NATIVE mysqli连接选项,如this page的示例#5中所述。请注意,它需要PHP使用mysqlnd库(您可以使用phpinfo来检查)。

2

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

$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); 
+0

我想问题是我的问题是正确构建阵列 – relyt 2012-07-21 19:52:57

+0

@relyt你有什么尝试? – alexn 2012-07-21 19:54:20

+0

我更新了我的问题。我知道我走了,但我一直盯着这个太久了。 – relyt 2012-07-21 20:26:58