极简代码实现高性能无限级分类

汉王 PHP+MySQL 收藏


极简代码实现高性能无限级分类(非递归迭代),关键代码其实只有一行.

  1. $return[$v['pid']]['child'][$v['id']] = &$return[$k];
但是为了实现较为复杂的扩展,这里添加一些额外的信息 目前这方法的缺点是:无法获取目录的层级信息
  1. //这个是元数据,你可以从数据库里面进行读取并且不需要进行转换
  2. //因为代码部分会进行遍历处理
  3. $list[] = ['id' => 0, 'pid' => -1, 'name' => 'A@0'];
  4. //-1用于后面的根目录判断
  5. //你也可以修改为0并修改后面的 if ($v['pid'] >= 0) 为 if ($v['pid'] > 0)
  6. //数据库id应该不会出现等于0的情况吧
  7. $list[] = ['id' => 1, 'pid' => 0, 'name' => 'A@1'];
  8. $list[] = ['id' => 2, 'pid' => 0, 'name' => 'A@2'];
  9. $list[] = ['id' => 3, 'pid' => 2, 'name' => 'A@3'];
  10. $list[] = ['id' => 4, 'pid' => 3, 'name' => 'A@4'];
  11. $list[] = ['id' => 5, 'pid' => 0, 'name' => 'A@5'];
  12. $list[] = ['id' => 6, 'pid' => 1, 'name' => 'A@6'];
  13. $return = [];//索引目录
  14. $parent='';//根目录,
  15. //数组预处理,这里的$v['id']一定要唯一,不然可能会出现被覆盖的情况
  16. foreach ($list as $v)
  17. $return[$v['id']] = [
  18. 'id' => $v['id'],
  19. 'name' => $v['name'],
  20. 'pid' => $v['pid'],
  21. 'child' => '',
  22. ];
  23. //将每个目录与父目录进行拼接,并找到根目录
  24. foreach ($return as $k=>$v) {
  25. if ($v['pid'] >= 0)
  26. //找到父路径,这里没有判断 $return[$v['pid']]['child']是否存在,
  27. //TP5下或者在不存在的情况下可能会报错,自己加一下
  28. $return[$v['pid']]['child'][$v['id']] = &$return[$k];
  29. else
  30. //找到根目录
  31. $parent = &$return[$k];
  32. }
  33. //打印根目录
  34. var_export($parent);

下载地址