我返回一個JSON文件是這樣的:如何正確地格式化PDO :: FETCH_NUM成JSON結果
ug_gpid: [[4], [2], [3]]
這不是預期的格式,我想這樣的:
ug_gpid: [4, 2, 3]
這是我的代碼:
我,結果存儲到$ugroup
。我怎樣才能達到理想的輸出?
我返回一個JSON文件是這樣的:如何正確地格式化PDO :: FETCH_NUM成JSON結果
ug_gpid: [[4], [2], [3]]
這不是預期的格式,我想這樣的:
ug_gpid: [4, 2, 3]
這是我的代碼:
我,結果存儲到$ugroup
。我怎樣才能達到理想的輸出?
問題是PDOStatement::fetchAll
返回一個數組數組。你想建立一個單一數值的平面數組。
我會用這個代替...
$stmt = $db->prepare($sql);
$stmt->bindParam(':id', $us_id);
foreach ($user as $item => $value) {
$newUser[$item] = $value;
$us_id = $value['us_id']; // this is for the bind
$stmt->execute();
while ($gpid = $stmt->fetchColumn()) {
$newUser[$item]['ug_gpid'][] = $gpid;
}
}
它之所以沒有如預期的那樣已經回答工作;然而,這將是更有效地使用一個單一的查詢:
$sql = sprintf(
"SELECT ug_usid, GROUP_CONCAT(ug_gpid)
FROM user_group
WHERE ug_usid IN (%s) AND ug_status = 1
GROUP BY ug_usid",
str_pad('?', count($user) * 2 - 1, ',?');
);
// ...
// run query and build search result map
$stmt = $db->prepare($sql);
$stmt->execute(array_column($user, 'us_id'));
$groups = $stmt->fetchAll(PDO::FETCH_KEY_PAIR);
// extend user information with search results
array_walk($user, function(&$u) use ($groups) {
if (isset($groups[$user['us_id']])) {
$u['ug_gpid'] = explode(',', $groups[$user['us_id']]);
} else {
$u['ug_gpid'] = [];
}
});
echo json_encode($user, JSON_NUMERIC_CHECK);
注意,它假設你使用MySQL作爲數據庫引擎,因爲它使用GROUP_CONCAT
這是SQL的MySQL擴展。
考慮在'catch'塊中返回一個HTTP錯誤狀態碼(4xx/5xx)。這樣,任何API客戶端都可以更好地捕獲錯誤 – Phil