我有一个mysql查询,该查询返回小动物的分类树。
类型->物种->品种->品种
基本上我需要:
json = {
"anátidas": {
"id": 1,"species": {
"patos": {
"id": 1,"breeds": {
"alto vuelo": {
"id":1,"varieties": {
"otro": {
"id":1
}
}
},{
"anade anteojillo": {
"id":2,"varieties": {
"otro": {
"id":2
}
}
},{
"anade bahamas": {
"id":3,"varieties": {
"blanco": {
"id":3
},{
"otro": {
"id":4
}
}
},{
"anade friso": {
"id":4,"varieties":{
"otro": {
"id":5
}
}
}
[...]
}
},{
"ocas": {
"id": 2,"breeds": {
"de cabeza barrada": {
"id":74,"varieties": {
"otro": {
"id":115
}
}
},{
"de egipto": {
"id":75,"varieties": {
"otro": {
"id":116
}
}
},{
"de los andes": {
"id":76,"varieties": {
"otro": {
"id":117
}
}
},[...]
}
}
},"cobayas": {
"id": 2,"species": {
"cobaya": {
"id": 14,"breeds": {
"alpaca": {
"id":1,"varieties": {
"aguti canela": {
"id":255
}
}
}
[...]
}
}
[...]
}
}
}
我拥有的数据是这样的(但是更长)
╔═════╦══════════╦═════╦═════════════════════╦═════╦══════════════════════════════╦══════╦═════════════════════════════════╗
║ tid ║ type ║ sid ║ species ║ bid ║ breed ║ vid ║ variety ║
╠═════╬══════════╬═════╬═════════════════════╬═════╬══════════════════════════════╬══════╬═════════════════════════════════╣
║ 1 ║ anátidas ║ 1 ║ patos ║ 1 ║ alto vuelo ║ 1 ║ otro ║
║ 1 ║ anátidas ║ 1 ║ patos ║ 2 ║ anade anteojillo ║ 2 ║ otro ║
║ 1 ║ anátidas ║ 1 ║ patos ║ 3 ║ anade bahamas ║ 3 ║ blanco ║
║ 1 ║ anátidas ║ 1 ║ patos ║ 3 ║ anade bahamas ║ 4 ║ otro ║
║ 1 ║ anátidas ║ 1 ║ patos ║ 4 ║ anade friso ║ 5 ║ otro ║
║ 1 ║ anátidas ║ 1 ║ patos ║ 12 ║ carolina ║ 14 ║ blanco ║
║ 1 ║ anátidas ║ 1 ║ patos ║ 12 ║ carolina ║ 15 ║ carolina ║
║ 1 ║ anátidas ║ 1 ║ patos ║ 12 ║ carolina ║ 16 ║ isabela ║
║ 1 ║ anátidas ║ 1 ║ patos ║ 16 ║ corredor indio ║ 31 ║ negro ║
║ 1 ║ anátidas ║ 1 ║ patos ║ 16 ║ corredor indio ║ 32 ║ otro ║
║ 1 ║ anátidas ║ 1 ║ patos ║ 16 ║ corredor indio ║ 33 ║ panache ║
║ 1 ║ anátidas ║ 1 ║ patos ║ 16 ║ corredor indio ║ 34 ║ plata ║
║ 1 ║ anátidas ║ 1 ║ patos ║ 16 ║ corredor indio ║ 35 ║ plata ║
║ 1 ║ anátidas ║ 2 ║ ocas ║ 74 ║ de cabeza barrada ║ 115 ║ otro ║
║ 1 ║ anátidas ║ 2 ║ ocas ║ 75 ║ de egipto ║ 116 ║ otro ║
║ 1 ║ anátidas ║ 2 ║ ocas ║ 76 ║ de los andes ║ 117 ║ otro ║
║ 1 ║ anátidas ║ 2 ║ ocas ║ 77 ║ emperador ║ 118 ║ otro ║
║ 1 ║ anátidas ║ 2 ║ ocas ║ 78 ║ nival ║ 119 ║ otro ║
║ 2 ║ cobayas ║ 14 ║ cobaya ║ 225 ║ alpaca ║ 255 ║ aguti canela ║
║ 2 ║ cobayas ║ 14 ║ cobaya ║ 225 ║ alpaca ║ 256 ║ aguti dorado ║
║ 2 ║ cobayas ║ 14 ║ cobaya ║ 225 ║ alpaca ║ 257 ║ aguti gris ║
║ 2 ║ cobayas ║ 14 ║ cobaya ║ 225 ║ alpaca ║ 258 ║ aguti plata ║
║ 2 ║ cobayas ║ 14 ║ cobaya ║ 225 ║ alpaca ║ 259 ║ chocolate ║
║ 2 ║ cobayas ║ 14 ║ cobaya ║ 225 ║ alpaca ║ 260 ║ negro ║
║ 2 ║ cobayas ║ 14 ║ cobaya ║ 225 ║ alpaca ║ 261 ║ otro ║
║ 2 ║ cobayas ║ 14 ║ cobaya ║ 225 ║ alpaca ║ 262 ║ tricolor ║
║ 2 ║ cobayas ║ 14 ║ cobaya ║ 226 ║ ch teddy ║ 263 ║ otro ║
║ 2 ║ cobayas ║ 14 ║ cobaya ║ 227 ║ coronada ║ 264 ║ aguti canela ║
║ 2 ║ cobayas ║ 14 ║ cobaya ║ 227 ║ coronada ║ 265 ║ aguti dorado ║
║ 3 ║ conejos ║ 15 ║ gigantes ║ 237 ║ angora ║ 282 ║ blanco ║
║ 3 ║ conejos ║ 15 ║ gigantes ║ 237 ║ angora ║ 283 ║ gris ║
║ 3 ║ conejos ║ 15 ║ gigantes ║ 237 ║ angora ║ 284 ║ negro ║
║ 3 ║ conejos ║ 15 ║ gigantes ║ 238 ║ angora aleman ║ 285 ║ azul ║
║ 3 ║ conejos ║ 15 ║ gigantes ║ 238 ║ angora aleman ║ 286 ║ blanco ║
║ 3 ║ conejos ║ 15 ║ gigantes ║ 238 ║ angora aleman ║ 287 ║ gris ║
╚═════╩══════════╩═════╩═════════════════════╩═════╩══════════════════════════════╩══════╩═════════════════════════════════╝
但是我完全看不到如何从一个过渡到另一个。
这是我正在尝试的方法,但它会生成一个普通的json,而不是结构正确的json:
$res = array();
foreach ($stmt as $row) {
array_push($res,$row);
}
json_encode($res);
您可以尝试一下,我认为:
1 /获取所有数据
SELECT tid,type,sid,species,bid,breed,vid,variety
FROM your_table
我将使用$your_data
作为提取的结果(一个数组,其中包含多个数组,在数据库中逐行)。
2 /构建阵列
$result = [];
foreach ($your_data as $row) {
$result[$row['type']]['id'] = $row['tid'];
$result[$row['type']]['species'][$row['species']]['id'] = $row['sid'];
$result[$row['type']]['species'][$row['species']]['breeds'][$row['breed']]['id'] = $row['bid'];
$result[$row['type']]['species'][$row['species']]['breeds'][$row['breed']]['varieties'][$row['variety']]['id'] = $row['vid'];
}
3 /现在只需在json中转换数组即可:
$json = json_encode($result);
以下是一些数据示例:link
我用于示例的数据:
$your_data = array(
0 => array(
'tid' => 1,'type' => 'anatidas','sid' => 2,'species' => 'ocas','bid' => 77,'breed' => 'emperador','vid' => 118,'variety' => 'otro'
),1 => array(
'tid' => 1,'bid' => 78,'breed' => 'nival',2 => array(
'tid' => 2,'type' => 'cobayas','sid' => 14,'species' => 'cobaya','bid' => 225,'breed' => 'alpaca','vid' => 257,'variety' => 'aguti canela'
),3 => array(
'tid' => 2,'variety' => 'aguti dorado'
),4 => array(
'tid' => 2,'variety' => 'aguti gris'
)
);
输出:
{
"anatidas": {
"id": 1,"species": {
"ocas": {
"id": 2,"breeds": {
"emperador": {
"id": 77,"varieties": {
"otro": {
"id": 118
}
}
},"nival": {
"id": 78,"varieties": {
"otro": {
"id": 118
}
}
}
}
}
}
},"cobayas": {
"id": 2,"species": {
"cobaya": {
"id": 14,"breeds": {
"alpaca": {
"id": 225,"varieties": {
"aguti canela": {
"id": 257
},"aguti dorado": {
"id": 257
},"aguti gris": {
"id": 257
}
}
}
}
}
}
}
}