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

Converting Query result to D3.js hierarchical JSON format

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

对于将来可能遇到此问题的任何人,我已设法使用以下代码解决它

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);