如何在REST API中按birth_place分组生成嵌套JSON数组?
实现按出生地分组并生成嵌套用户数组的方案
有两种可行方案可以实现你要的嵌套JSON结构,根据你的MySQL版本和需求选择:
方案一:PHP端手动分组(兼容所有MySQL版本)
先查询所有用户的完整数据,再通过PHP循环将用户按出生地分组,同时统计每组的用户数量:
$db = db_connect(); // 查询所有用户数据,按出生地排序方便分组 $users = $db->query('SELECT id, name, birth_date, gender, birth_place FROM users ORDER BY birth_place')->getResultArray(); $groupedData = []; foreach ($users as $user) { $birthPlace = $user['birth_place']; // 移除出生地字段,避免重复 unset($user['birth_place']); if (!isset($groupedData[$birthPlace])) { $groupedData[$birthPlace] = [ 'birth_place' => $birthPlace, 'jumlah_data_user' => 0, 'users' => [] ]; } $groupedData[$birthPlace]['jumlah_data_user']++; $groupedData[$birthPlace]['users'][] = $user; } // 将关联数组转为索引数组,符合返回格式 $data = [ 'status' => true, 'error' => null, 'data' => array_values($groupedData) ]; return $this->respond($data, 200);
方案二:利用MySQL JSON函数(MySQL 5.7+ 支持)
如果你的MySQL版本在5.7及以上,可以直接用JSON_ARRAYAGG和JSON_OBJECT函数在SQL中生成嵌套的用户数组,减少PHP端的处理逻辑:
$db = db_connect(); $sql = " SELECT birth_place, COUNT(id) as jumlah_data_user, JSON_ARRAYAGG( JSON_OBJECT( 'id', id, 'name', name, 'birth_date', birth_date, 'gender', gender ) ) as users FROM users GROUP BY birth_place "; $data = [ 'status' => true, 'error' => null, 'data' => $db->query($sql)->getResultArray() ]; return $this->respond($data, 200);
注意事项
- 方案一兼容性强,不管MySQL版本都能运行,分组逻辑灵活,方便后续扩展;
- 方案二由数据库直接完成数据聚合,减少PHP端循环处理,数据量大时性能更优;
- 两种方案返回的结果都完全匹配你期望的嵌套JSON结构,
jumlah_data_user会自动以数字类型返回。
内容的提问来源于stack exchange,提问作者Gibransyah
相关产品推荐
相关产品推荐

