首页 > 数据库提取的扁平数据结构转树状结构的算法

数据库提取的扁平数据结构转树状结构的算法

从数据库中取出的数据,如
省, 市, 区
山东,济南,a区
山东,济南,m区
山东,青岛,b区
江苏,南京,a区

转化为(可看作是json):

山东:
    济南:
        a区
        m区
    青岛:
        b区
江苏:
    南京:
        a区

请问有没有好的算法?


数据库要有 id,pid字段,一次把有有要用的数据读出来,然后按父子关系,递归的地把它存到一个多维数组,
写了个例子,写不得好不要喷我

<?php
$city = array(
    0 => array('id' => '1','pid' => '0','name' => '广西',) ,
    1 => array('id' => '2','pid' => '1','name' => '南宁',) ,
    2 => array('id' => '3','pid' => '1','name' => '桂林',) ,
    3 => array('id' => '6','pid' => '0','name' => '广东',) ,
    4 => array('id' => '7','pid' => '6','name' => '广州',) ,
    5 => array('id' => '8','pid' => '6','name' => '东莞',) ,
);
function get_tree($data, $pid = 0, $parent_key_name = 'parentid', $get_all_child = true) {
    $tmp = array();
    foreach ($data as $key => $value) {
        if ($value[$parent_key_name] == $pid) {
            $tmp[$key] = $value;
            unset($data[$key]);
            if ($get_all_child) {
                $child = get_tree($data, $value['id'], $parent_key_name, $get_all_child);
                if (!empty($child)) {
                    $tmp[$key]['child'] = $child;
                }
            }
        }
    }
    if ($get_all_child) {
        $pid++;
    }
    return $tmp;
}
$new_city = get_tree($city, 0, 'pid', true);
var_dump($new_city);


省市区依次作为第一第二第三关键字,然后检查前后对于相同的合并。


id pid设计难道不是更简洁,还用设计三个字段

【热门文章】
【热门文章】