人生最大的错误是不断担心会犯错 [登录·注册]

吕滔博客

首页 开发 运维 工具 摄影

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

开发 memory发布于January 11, 2017 标签: PHP

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

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

相关推荐

添加新评论

网站状态

  • 栏目分类:35个
  • 发布文章:1089篇
  • 用户评论:582条

最新回复

  • 嘿嘿: 高大上 嘿嘿
  • 嘿嘿: 呦西~~
  • memory: 实在是抱歉,我昨天找了一下我WIN电脑上的编译,发现当时编译完测...
  • kavid: 楼主发到我的邮箱呗 kavid@sina.com
  • 凯哥自媒体: 这个很不错,谢谢分享
  • memory: 在单位WINPC上,周一吧,我努力记着想死这事儿,到时候打包了发上来!
  • kavid: 楼主能把dll分享出来吗??正好我用的php 7.1php官方的...
  • zhaoliang0112: 厉害了,我哥的!!
  • zhaoliang0112: 希望能够有个系统的教程,就不要在去网上找了,直接这里学习!! :)
  • memory: 这是13年淘宝dba分享的一片文章,网上应该还有,我拿过来还没有...
  • wqintel: 而net.ipv4.tcp_mem则是配置tcp的内存大小,其单...
  • memory: 我这个站不是java写的哟~~~这是typecho开源博客程序改...
  • memory: 可以使用nginx反向代理后台的这个5000端口。
  • jarjar: 博主的java站好快啊
  • 凤凰山草民: java站这么快,厉害
  • 若铭: psdash可以部署到nginx上吗?
  • PHP程序员雷雪松: 很实用的PHP代码块!!!
  • codes: 把 .dll 发出来让我试试啊
  • 凯哥自媒体: 这个挺不错的
  • php: 怎么解密????