php无限级分类(带层深)算法

 代码如下 复制代码

<?php
$cates = array(
 array(
  'cid'   => 1,
  'cname' => '新闻',
  'pid'   => 0
 ),

 array(
  'cid'   => 2,
  'cname' => '通知',
  'pid'   => 0
 ),

 array(
  'cid'   => 3,
  'cname' => '国内新闻',
  'pid'   => 1
 ),

 array(
  'cid'   => 4,
  'cname' => '国际新闻',
  'pid'   => 1
 ),

 array(
  'cid'   => 5,
  'cname' => '北京新闻',
  'pid'   => 3
 ),

 array(
  'cid'   => 6,
  'cname' => '上海新闻',
  'pid'   => 3
 ),

 array(
  'cid'   => 7,
  'cname' => '紧急通知',
  'pid'   => 2
 ),

 array(
  'cid'   => 8,
  'cname' => '一般通知',
  'pid'   => 2
 ),
);

/**
 * 生成菜单
 *
 * @param array $data 原始数据
 * @param integer $pid 当前分类的父id
 * @return array 处理后数据
 */
function createMenuTree($data = array(), $pid = 0)
{
 if (empty($data))
 {
  return array();
 }

 static $level = 0;

 $returnArray = array();

 foreach ($data as $node)
 {
  if ($node['pid'] == $pid)
  {
   $returnArray[] = array(
    'cid'   => $node['cid'],
    'cname' => $node['cname'],
    'level' => $level
   );

   if (hasChild($node['cid'], $data))
   {
    $level++;

    $returnArray = array_merge($returnArray, createMenuTree($data, $node['cid']));

    $level--;
   }
  }
 }

 return $returnArray;
}

/**
 * 检查是否有子分类
 *
 * @param integer $cid 当前分类的id
 * @param array $data 原始数据
 * @return boolean 是否有子分类
 */
function hasChild($cid, $data)
{
 $hasChild = false;

 foreach ($data as $node)
 {
  if ($node['pid'] == $cid)
  {
   $hasChild = true;
   break;
  }
 }

 return $hasChild;
}

header('Content-Type: text/html; charset=utf-8');

$result = createMenuTree($cates);

foreach ($result as $row)
{
 for ($i = 0; $i < $row['level']; $i++)
 {
  echo "t";
 }

 echo $row['cname'] . "n";
}
?>

时间: 2024-10-09 23:22:39

php无限级分类(带层深)算法的相关文章

php无限级分类(带数据库)(1/2)

 代码如下 复制代码 <!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.111cn.net/1999/xhtml"> <head> <meta http-equiv=

PHP无限级分类查找父层函数

函数 如: classID          classFID          className          classCount      1                  0                   中国                     0      2                  1                   浙江                     0      3                  1                

mysql 无限级分类实现思路_Mysql

第一种方案: 使用递归算法,也是使用频率最多的,大部分开源程序也是这么处理,不过一般都只用到四级分类.这种算法的数据库结构设计最为简单.category表中一个字段id,一个字段fid(父id).这样可以根据WHERE id = fid来判断上一级内容,运用递归至最顶层. 分析:通过这种数据库设计出的无限级,可以说读取的时候相当费劲,所以大部分的程序最多3-4级分类,这就足以满足需求,从而一次性读出所有的数据,再对得到数组或者对象进行递归.本身负荷还是没太大问题.但是如果分类到更多级,那是不可取

左右值无限级分类

什么是左右值无限级分类: 左右值无限级分类,也称为预排序树无限级分类,是一种有序的树状结构,位于这些树状结构中的每一个节点都有一个"左值"和"右值",其规则是:每一个后代节 点的左值总是大于父类,右值总是小于父级,右值总是小于左值.处于这些结 构中的每一个节点,都可以轻易的算出其祖先或后代节点.因此,可以用它来实现无限分类.优点:通过一条SQL就可以获取所有的祖先或后代,这在复杂的分类中非常必要,通过简单的四则运算就可以得到后代的数量.由于这种方法不使用递归查询算法

PHP实现无限级分类(不使用递归)_php技巧

无限级分类在开发中经常使用,例如:部门结构.文章分类.无限级分类的难点在于"输出"和"查询",例如 将文章分类输出为<ul>列表形式: 查找分类A下面所有分类包含的文章. 1.实现原理 几种常见的实现方法,各有利弊.其中"改进前序遍历树"数据结构,便于输出和查询,但是在移动分类和常规理解上有些复杂. 2.数据结构 <?php $list = array( array('id'=>1, 'fid'=>0, 'title

表格展示无限级分类(PHP版)_php实例

TreeTable通过对单元格的行合并和列合并实现了无限层级也能较好的展示层级架构. 1.构建ID/PID/NAME的数组,后期可通过数据库生成的动态数据.Tree算法请点击 复制代码 代码如下: array( * 1 => array('id'=>'1','parentid'=>0,'name'=>'一级栏目一'), * 2 => array('id'=>'2','parentid'=>0,'name'=>'一级栏目二'), * 3 => array

C#递归方法实现无限级分类显示效果实例_C#教程

本文实例讲述了C#递归方法实现无限级分类显示效果.分享给大家供大家参考,具体如下: 运行效果如下图所示: 具体代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="RoleDemo20150305.aspx.cs" Inherits="RoleDemo20150305" %> <!DOCTYPE html PUBLIC "-//W

2款PHP无限级分类实例代码_php技巧

本文章总结了两款PHP无限级分类实现程序代码,有需要学习的朋友可参考一下.主要思路:首先看第三行和第四行,父类ID(PARENTID)的值是1,表示属于id=1这个类的子类,而,一,二两行因为是一级分类,没有上级分类,所以父类ID(PARENTID)的值是0,表示初级分类,依次类推便实现了无限级分类.最终的效果是:├一级分类A ├─┴二级分类A ├─┴二级分类B ├一级分类B然后就是程序,这里以PHP作为描述语言,可以很方便的改成其他语言,因为原理相似,就是一个递归而已. <?php $dbho

表格展示无限级分类(PHP版)

表格展示无限级分类(PHP版) TreeTable是一个能把无限分类展现为表格形式的PHP类库插件,分类的层级表示为表格的列,分类的行数表格分类的总数.单元格显示分类名称. TreeTable通过对单元格的行合并和列合并实现了无限层级也能较好的展示层级架构.   1.构建ID/PID/NAME的数组,后期可通过数据库生成的动态数据.Tree算法请点击  代码如下 复制代码 ?array(     *      1 => array('id'=>'1','parentid'=>0,'nam