关于无限级分类的一点思考(PHP+MySQL)

以下内容中有些内容可能不一定适合所有业务,比如查找所有子集和所有父集,一般的业务需求都是往上或往下查一级。。。这儿不做深究,以学习为主。
数组格式

$items = array(
    1 => array('id' => 1, 'parentid' => 0, 'name' => '江西省'),
    2 => array('id' => 2, 'parentid' => 0, 'name' => '黑龙江省'),
    3 => array('id' => 3, 'parentid' => 1, 'name' => '南昌市'),
    4 => array('id' => 4, 'parentid' => 2, 'name' => '哈尔滨市'),
    5 => array('id' => 5, 'parentid' => 2, 'name' => '鸡西市'),
    6 => array('id' => 6, 'parentid' => 4, 'name' => '香坊区'),
    7 => array('id' => 7, 'parentid' => 4, 'name' => '南岗区'),
    8 => array('id' => 8, 'parentid' => 6, 'name' => '和兴路'),
    9 => array('id' => 9, 'parentid' => 7, 'name' => '西大直街'),
    10 => array('id' => 10, 'parentid' => 8, 'name' => '东北林业大学'),
    11 => array('id' => 11, 'parentid' => 9, 'name' => '哈尔滨工业大学'),
    12 => array('id' => 12, 'parentid' => 8, 'name' => '哈尔滨师范大学'),
    13 => array('id' => 13, 'parentid' => 1, 'name' => '赣州市'),
    14 => array('id' => 14, 'parentid' => 13, 'name' => '赣县'),
    15 => array('id' => 15, 'parentid' => 13, 'name' => '于都县'),
    16 => array('id' => 16, 'parentid' => 14, 'name' => '茅店镇'),
    17 => array('id' => 17, 'parentid' => 14, 'name' => '大田乡'),
    18 => array('id' => 18, 'parentid' => 16, 'name' => '义源村'),
    19 => array('id' => 19, 'parentid' => 16, 'name' => '上坝村'),
);

目录树算法

function class_sort($items) {
    foreach ($items as $item){
        $items[$item['parentid']]['son'][$item['id']] = &$items[$item['id']];
    }
    return isset($items[0]['son']) ? $items[0]['son'] : array();
}

根据键名从目录树中查找子集

function array_search_key($needid, $items){
    global $nodes_found;
    foreach ($items as $key=>$value) {
        if ($key=== $needid){
            $nodes_found[$key] = $value;
        }
        if (is_array($value)) array_search_key($needid, $value);
    }
    return $nodes_found;
}

根据键名从目录树中获取所有父集ID

function get_parent($id,$tree) {
    if (!is_array($tree)) return array();
    global $parent_found;
    if($tree[$id]['parentid']){
        $parent_found[]=$tree[$id]['parentid'];
        return get_parent($tree[$id]['parentid'],$tree);
    }
    return $parent_found;
}

父节点时将父节点的所有子节点删除的业务需求,我一般会先获取子集的id,然后一次删除。这样比网上流传的那种每次循环一次请求一次数据库要节约不少的数据库请求量

简单的测试一下

echo '<pre>';
$items_sort = class_sort($items);
print_r($items_sort);
echo '<hr/>';
print_r(array_search_key(2,$items_sort));
echo '<hr/>';
print_r(get_parent(12,$items));
最后修改时间为:2017 年 01 月 11 日 03 时 32 分 PM
如果觉得我的文章对你有用,请随意赞赏

发表评论