失言就是一不小心说了实话 [登录·注册]

吕滔博客

首页 开发 运维 工具 摄影

关于无限级分类的一点思考(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个
  • 发布文章:1096篇
  • 用户评论:599条

最新回复

  • Bearox: 我也遇到了同样的问题,yum install dev86* 没用...
  • themebetter: 优化方法很不错。
  • 架构之路: 总结和nice,网站速度很快。
  • 架构之路: 总结的很好,简单、完整、高效。
  • memory: 我正在犹豫要不要更新了~~~ 因为1.2撇弃了php5.2,最低...
  • 灵九哲: medoo已经更新到v1.2了,博主更新下中文版网站内容
  • 灵九哲: medoo已经更新了v1.2,麻烦博主更新下中文版的网站,然后把...
  • memory: 用的typecho.
  • einsan: 涛哥,你的博客后端是自己开发的吗?还是使用哪一款开源产品?
  • yfly962464: 不行啊
  • memory: 哥们儿~非常不好意思,之前有段时间折腾jpress,后来就没有玩...
  • 夏日草博客: 记得很早的时候来过这个博客。
  • test1247: 好的,感谢。邮箱 121217605@qq.com
  • memory: 好的, 我回头找找呀。因为现在这个程序是php的,jpress的...
  • test1247: 这个jpress的主题能分享下吗
  • ryan: 瓦咔咔。。。。。。
  • PHP程序员雷雪松: 非常详细的windows下MySQL的安装!!!
  • 嘿嘿: 高大上 嘿嘿
  • 嘿嘿: 呦西~~
  • memory: 实在是抱歉,我昨天找了一下我WIN电脑上的编译,发现当时编译完测...