我有一个数据库结果,我需要转换为正确的json格式供D3.js使用。这个代码到目前为止,结果
数据库查询结果:
desti_cat class_cat area_cat totalcost
UK Multi media services Multi media services 80.361
UK Other Service Number AC & SC 85.369
UK Other Multimedia Services Sent 1.628
UK Other Multimedia Services Recd 32.394
UK Other Traffic Service 0.85
UK Other #Charity Donation 5
UK Other Unknown 0.25
UK Other Multimedia Service 4.113
Roaming GPRS GPRS 2574.926
Roaming Multi media services Multi media services 5.34
Roaming SMS SMS 105.9
Roaming Voice Voice 833.611
International SMS SMS 25
International Voice Voice 830.014
PHP:
foreach($result as $line)
{
$desticat = $line['desti_cat'];
$classcat = $line['class_cat'];
$areacat = $line['area_cat'];
$cost = $line['totalcost'];
if($classcat != $areacat){
$data[$desticat]['children'][$classcat]['children'][$areacat]['cost'] = $cost;
$data[$desticat]['name'] = $desticat;
$data[$desticat]['children'][$classcat]['name'] = $classcat;
$data[$desticat]['children'][$classcat]['children'][$areacat]['name'] = $areacat;
}else{
$data[$desticat]['children'][$classcat]['cost'] = $cost;
$data[$desticat]['name'] = $desticat;
$data[$desticat]['children'][$classcat]['name'] = $classcat;
}
}
json_encode之后的结果:
{
"UK":{
"children":{
"Multi media services":{
"cost":80.361,
"name":"Multi media services"
},
"Other":{
"children":{
"Service Number AC & SC":{
"cost":85.369,
"name":"Service Number AC & SC"
},
"Multimedia Services Sent":{
"cost":1.628,
"name":"Multimedia Services Sent"
},
"Multimedia Services Recd":{
"cost":32.394,
"name":"Multimedia Services Recd"
},
"Traffic Service":{
"cost":0.85,
"name":"Traffic Service"
},
"#Charity Donation":{
"cost":5,
"name":"#Charity Donation"
},
"Unknown":{
"cost":0.25,
"name":"Unknown"
},
"Multimedia Service":{
"cost":4.113,
"name":"Multimedia Service"
}
},
"name":"Other"
}
},
"name":"UK"
} ... Roaming ... International
这显然是错误的,我可以看出它是错的,但不是为什么,或者如何解决它。它需要匹配此处显示的flare.js格式https://bl.ocks.org/mbostock/4348373
答案 0 :(得分:1)
对于未来可能会遇到此问题的任何人,我已设法使用以下代码解决此问题
function array_values_recursive($arr)
{
$arr2=[];
foreach ($arr as $key => $value)
{
//var_dump($key);
if($key != 'children' && $key != 'name' && $key != 'size'){
if(is_array($value))
{
$arr2[] = array_values_recursive($value);
}else{
$arr2[] = $value;
}
}else{
if(is_array($value))
{
$arr2[$key] = array_values_recursive($value);
}else{
$arr2[$key] = $value;
}
}
}
return $arr2;
}
$data = [
'name' => 'Spend'
];
foreach($result as $line)
{
$desticat = $line['desti_cat'];
$classcat = $line['class_cat'];
$areacat = $line['area_cat'];
$cost = $line['totalcost'];
if($classcat != $areacat){
$data['children'][$desticat]['name'] = $desticat;
$data['children'][$desticat]['children'][$classcat]['name'] = $classcat;
$data['children'][$desticat]['children'][$classcat]['children'][$areacat]['name'] = $areacat;
$data['children'][$desticat]['children'][$classcat]['children'][$areacat]['size'] = $cost;
}else{
$data['children'][$desticat]['name'] = $desticat;
$data['children'][$desticat]['children'][$classcat]['name'] = $classcat;
$data['children'][$desticat]['children'][$classcat]['size'] = $cost;
}
}
//return $result;
return array_values_recursive($data);