将查询结果转换为D3.js分层JSON格式

时间:2017-05-12 14:16:36

标签: d3.js sunburst-diagram

我有一个数据库结果,我需要转换为正确的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

1 个答案:

答案 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);
相关问题