GVKun编程网logo

PHP 无限极分类下拉列表实现(php无限极分类的方法)

26

对于想了解PHP无限极分类下拉列表实现的读者,本文将提供新的信息,我们将详细介绍php无限极分类的方法,并且为您提供关于php实现无限极分类、php无限极分类、php无限极分类递归函数实现、php+m

对于想了解PHP 无限极分类下拉列表实现的读者,本文将提供新的信息,我们将详细介绍php无限极分类的方法,并且为您提供关于php 实现无限极分类、php 无限极分类、php 无限极分类 递归函数实现、php+mysql 实现无限极分类的有价值信息。

本文目录一览:

PHP 无限极分类下拉列表实现(php无限极分类的方法)

PHP 无限极分类下拉列表实现(php无限极分类的方法)

1. 递归实现下拉列表

<div>

分类 
 */

include('db.inc.PHP');

function getList($pid = 0,&$result = array(),$spac = 0){
$spac = $spac + 2;
$sql = "SELECT * FROM DEEPCATE WHERE pid = $pid";
$res = MysqL_query($sql);
while($row = MysqL_fetch_array($res)){
$row['catename'] = str_repeat('<span>&nbsp;<span>',$spac).'|--'.$row['catename'];
$result[] = $row;
getList($row['id'],$result,$spac);
}
return $result;
}

function displayCate($pid=0,$select = 0){
$rs = getList($pid);
$str .= "<span><<span>select <span>name <span>= 'cate'<span>><span>";
foreach ($rs as $key => $val) {
$selected = '';
if($val['id'] == $selected){
$selected = "selected";
}
$str .= "<span><<span>option <span>{$selected}<span>>{$val['catename']}<span></<span>option<span>><span>";
}
return $str .= '<span></<span>select<span>><span>'
}

echo displayCate(0);

php 实现无限极分类

php 实现无限极分类

原始数据

$array = array(
    array(''id'' => 1, ''pid'' => 0, ''n'' => ''河北省''),
    array(''id'' => 2, ''pid'' => 0, ''n'' => ''北京市''),
    array(''id'' => 3, ''pid'' => 1, ''n'' => ''邯郸市''),
    array(''id'' => 4, ''pid'' => 2, ''n'' => ''朝阳区''),
    array(''id'' => 5, ''pid'' => 2, ''n'' => ''通州区''),
    array(''id'' => 6, ''pid'' => 4, ''n'' => ''望京''),
    array(''id'' => 7, ''pid'' => 4, ''n'' => ''酒仙桥''),
    array(''id'' => 8, ''pid'' => 3, ''n'' => ''永年区''),
    array(''id'' => 9, ''pid'' => 1, ''n'' => ''武安市''),
    array(''id'' => 10, ''pid'' => 8, ''n'' => ''永年区镇''),
    array(''id'' => 11, ''pid'' => 0, ''n'' => ''上海市'')
);

 

生成无限极分类

/** 所有的分类
 * @parem $array 数组
 * @parem $pid ,最高级别,默认为0,输出从pid 级别的数据
 * @parem $level 层级,默认0
 * */
function getTree($array, $pid =0, $level = 0){

    $f_name=__FUNCTION__; // 定义当前函数名

    //声明静态数组,避免递归调用时,多次声明导致数组覆盖
    static $list = [];

    foreach ($array as $key => $value){
        //第一次遍历,找到父节点为根节点的节点 也就是pid=0的节点
        if ($value[''pid''] == $pid){
            //父节点为根节点的节点,级别为0,也就是第一级
            $flg = str_repeat(''|--'',$level);
            // 更新 名称值
            $value[''n''] = $flg.$value[''n''];
            // 输出 名称
            echo $value[''n'']."<br/>";
            //把数组放到list中
            $list[] = $value;
            //把这个节点从数组中移除,减少后续递归消耗
            unset($array[$key]);
            //开始递归,查找父ID为该节点ID的节点,级别则为原级别+1
            $f_name($array, $value[''id''], $level+1);
        }
    }
    return $list;
}
// 调用
$list=getTree($array);

调用结果:

河北省
|--邯郸市
|--|--永年区
|--|--|--永年区镇
|--武安市
北京市
|--朝阳区
|--|--望京
|--|--酒仙桥
|--通州区

 

嵌套标签,前端可以(通过选取子节点)全选、取消全选

function getTree($array, $pid =0, $level = 0){

    $f_name=__FUNCTION__; // 定义当前函数名

    // 空数组 不在执行
    if(empty($array))
        return;

    //声明静态数组,避免递归调用时,多次声明导致数组覆盖
    static $html;
    $html.="<ul>";
    
    foreach ($array as $key => $value){

        //第一次遍历,找到父节点为根节点的节点 也就是pid=0的节点
        if ($value[''pid''] == $pid){
            //父节点为根节点的节点,级别为0,也就是第一级
            $flg = str_repeat(''|--'',$level);
            // 更新 名称值
            $value[''n''] = $flg.$value[''n''];
            $html.=$temp="<li><input type=\"checkbox\" name=\"limit_id[]\" value=''".$value[''id'']."'' >".$value[''n''];

            //把这个节点从数组中移除,减少后续递归消耗
            unset($array[$key]);
            //开始递归,查找父ID为该节点ID的节点,级别则为原级别+1
            $vv=$f_name($array, $value[''id''], $level+1);

            // 如果顶级分类下没有一个下级,删除此分类,此步骤可以省略
            if(empty($vv) && ($pid<1))
            {
                $html=str_replace($temp,'''',$html);
            }
            $html.="</li>\r\n";

        }
    }
    $html.="</ul>\r\n";

    // 删除多余的 ul 标签
    $html=str_replace("<ul></ul>",'''',$html);
    return $html;
}

html 输出结果

<ul>
    <li><input type="checkbox" name="limit_id[]" value=''1''>河北省
        <ul>
            <li><input type="checkbox" name="limit_id[]" value=''3''>|--邯郸市
                <ul>
                    <li><input type="checkbox" name="limit_id[]" value=''8''>|--|--永年区
                        <ul>
                            <li><input type="checkbox" name="limit_id[]" value=''10''>|--|--|--永年区镇
                            </li>
                        </ul>
                    </li>
                </ul>
            </li>
            <li><input type="checkbox" name="limit_id[]" value=''9''>|--武安市
            </li>
        </ul>
    </li>
    <li><input type="checkbox" name="limit_id[]" value=''2''>北京市
        <ul>
            <li><input type="checkbox" name="limit_id[]" value=''4''>|--朝阳区
                <ul>
                    <li><input type="checkbox" name="limit_id[]" value=''6''>|--|--望京
                    </li>
                    <li><input type="checkbox" name="limit_id[]" value=''7''>|--|--酒仙桥
                    </li>
                </ul>
            </li>
            <li><input type="checkbox" name="limit_id[]" value=''5''>|--通州区
            </li>
        </ul>
    </li>
    </li>
</ul>
View Code 

jquery 操作全选

//父级选中 自动选中子级,同时选中自己的父级
    $(''input[type="checkbox"]'').change(function(e) {
        var checked = $(this).prop("checked"),
            container = $(this).parent(),
            siblings = container.siblings();

        container.find(''input[type="checkbox"]'').prop({
            indeterminate: false,
            checked: checked
        });

        function checkSiblings(el) {

            var parent = el.parent().parent(),
                all = true;

            el.siblings().each(function() {
                return all = ($(this).children(''input[type="checkbox"]'').prop("checked") === checked);
            });

            if (all && checked) {

                parent.children(''input[type="checkbox"]'').prop({
                    indeterminate: false,
                    checked: checked
                });

                checkSiblings(parent);

            } else if (all && !checked) {

                parent.children(''input[type="checkbox"]'').prop("checked", checked);
                parent.children(''input[type="checkbox"]'').prop("indeterminate", (parent.find(''input[type="checkbox"]:checked'').length > 0));
                checkSiblings(parent);

            } else {

                el.parents("li").children(''input[type="checkbox"]'').prop({
                    indeterminate: true,
                    checked: false
                });

            }

        }
        checkSiblings(container);
    });
    // 父级选中 自动选中子级
    /*$("input[type=checkbox]").each(function (i,ele){
        let _this=$(this);
        _this.click(function(){
            if(_this.prop(''checked'')==true)
            {
                _this.parent().find(''ul input'').prop(''checked'',true);
            }else
            {
                _this.parent().find(''ul input'').prop(''checked'',false);
            }
        });
    });*/

 

数组嵌套

引用嵌套,php变量默认的传值方式是按指传递,也就是说 假如说 遍历顺序是 河北省 邯郸市 当遍历到河北省时需要把河北省放到tree中,遍历到邯郸市时,需要把邯郸市放到河北省的子节点数组中,所以这里用到了引用传递,当你对河北省做更改时,tree数组中的河北省也一并做了更改

function getTree($list, $pid = 0)
{
    $tree = [];
    if (!empty($list)) {
        $newList = [];

        foreach ($list as $k => $v) {
            $newList[$v[''id'']] = $v;
        }
        foreach ($newList as $value ) {
            if ($pid == $value[''pid'']) {
                $tree[] = &$newList[$value[''id'']];
            } elseif (isset($newList[$value[''pid'']]))
            {
                $newList[$value[''pid'']][''items''][] = &$newList[$value[''id'']];
            }
        }
        // 如果顶级分类下没有一个下级,删除此分类,此步骤可以省略
        foreach ($tree as $k=>$v)
        {
            if(!isset($v[''items'']) && ($pid<1))
                unset($tree[$k]);
        }
    }
    return $tree;
}
// 调用
$list=getTree($array);
var_dump($list);

显示结果

array(2) {
  [0]=>
  array(4) {
    ["id"]=>
    int(1)
    ["pid"]=>
    int(0)
    ["n"]=>
    string(9) "河北省"
    ["items"]=>
    array(2) {
      [0]=>
      array(4) {
        ["id"]=>
        int(3)
        ["pid"]=>
        int(1)
        ["n"]=>
        string(9) "邯郸市"
        ["items"]=>
        array(1) {
          [0]=>
          array(4) {
            ["id"]=>
            int(8)
            ["pid"]=>
            int(3)
            ["n"]=>
            string(9) "永年区"
            ["items"]=>
            array(1) {
              [0]=>
              array(3) {
                ["id"]=>
                int(10)
                ["pid"]=>
                int(8)
                ["n"]=>
                string(12) "永年区镇"
              }
            }
          }
        }
      }
      [1]=>
      array(3) {
        ["id"]=>
        int(9)
        ["pid"]=>
        int(1)
        ["n"]=>
        string(9) "武安市"
      }
    }
  }
  [1]=>
  array(4) {
    ["id"]=>
    int(2)
    ["pid"]=>
    int(0)
    ["n"]=>
    string(9) "北京市"
    ["items"]=>
    array(2) {
      [0]=>
      array(4) {
        ["id"]=>
        int(4)
        ["pid"]=>
        int(2)
        ["n"]=>
        string(9) "朝阳区"
        ["items"]=>
        array(2) {
          [0]=>
          array(3) {
            ["id"]=>
            int(6)
            ["pid"]=>
            int(4)
            ["n"]=>
            string(6) "望京"
          }
          [1]=>
          array(3) {
            ["id"]=>
            int(7)
            ["pid"]=>
            int(4)
            ["n"]=>
            string(9) "酒仙桥"
          }
        }
      }
      [1]=>
      array(3) {
        ["id"]=>
        int(5)
        ["pid"]=>
        int(2)
        ["n"]=>
        string(9) "通州区"
      }
    }
  }
}
View Code

 

根据子类id查找出所有父级分类信息

/**根据指定id 的查询,所有的父节点
 * @parem $id_pid 要查询的id 或者 要查询id的pid;如果传入的是id 包括当前id 值,如果传入id_pid不包括当前id的值
 * @parem $array 查分类的数据,在项目使用中此参数可以不传,直接使用sql 查询
 * @parem $level 当前id所在层级,默认2
 * */
function getParent($id_pid,$array=array(), $level = 2)
{
    $f_name=__FUNCTION__; // 定义当前函数名
    static $list=array();
    //$array=Db::table(''table_name'')->where(''id'',$id_pid)->select(); TP5
    foreach($array as $k=>$v)
    {
        if($v[''id'']== $id_pid)
        {   //父级分类id等于所查找的id
            $flg = str_repeat(''|--'',$level);
            // 更新 名称值
            $v[''n''] = $flg.$v[''n''];
            // 输出 名称
            echo $v[''n'']."<br/>";
            $list[]=$v;
       // 删除数组
       unset($array[$k]);
if($v[''pid'']>=0) { $f_name($v[''pid''],$array,$level-1); } } } return $list; } // 调用 getParent(10,$array, $level = 3); echo "<hr/>"; getParent(8,$array, $level = 3);

调用结果显示

getParent(10,$array, $level = 3);
|--|--|--永年区镇
|--|--永年区
|--邯郸市
-----------------------------------------
getParent(8,$array, $level = 3);
河北省
|--|--|--永年区
|--|--邯郸市
|--河北省

 

根据父id获得所有下级子类数

/**根据指定id 查询,所有的子节 
* @parem $id 要查询的id 
* @parem $array 查分类的数据,在项目使用中此参数可以不传,直接使用sql 查询

* @parem $level 层级,默认1 *
*/ function getSon($id,$array=array(),$level=1) { $f_name=__FUNCTION__; // 定义当前函数名 static $list; //$array=Db::table(''table_name'')->where(''pid'',$id)->select(); TP5 foreach ($array as $k => $v) { if($v[''pid''] == $id) { $flg = str_repeat(''|--'',$level); // 更新 名称值 $v[''n''] = $flg.$v[''n'']; // 输出 名称 echo $v[''n'']."<br/>"; //存放数组中 $list[] = $v;
       // 删除查询过的数组
        unset($array[$k]); $f_name(
$v[''id''],$array,$level+1); } } return $list; }
// 调用
$list=$f_name(1,$array);

 调用结果:

|--邯郸市
|--|--永年区
|--|--|--永年区镇
|--武安市

php 无限极分类

php 无限极分类

/*
 *@pram $array 数组
 *@pram $pid   子id
 *@pram $level  等级  0 最顶级 以此类推
 */
  function test($array,$pid=0,$level=0){
      //定义数组存放找到的数据,静态防止覆盖
         static $list=[];
         foreach ($array as $key => $value) {
             //判断,先找到顶级栏目
                 if($value[''pid'']==$pid){
               //找到顶级栏目后加标识,最顶级level=0
                     $value[''level'']=$level;
                     //找到所需栏目保存到事先定义好的list数组中
                     $list[]=$value;
                     //然后销毁当前已找到的数据的key,避免下次重复递归,消耗资源
                     nuset($array[$key]);

                     //开始递归,找完pid=0,找pid=1的,level+1。以此类推。
                     test($array,$value[''id''],$level+1);
                 }
         }

         return $list;
  }

php 无限极分类 递归函数实现

php 无限极分类 递归函数实现

/**

 * 

 * @param 所有数组 $array

 * @param 当前用户ID $id

 * @param 储存变量 $str

立即学习“PHP免费学习笔记(深入)”;

 * @return string

 */

function findIds($array,$id,$str='''') {

$result = findChild($array,$id);//取得当前节点下的所有同级子节点

foreach ($result as $k => $v){

// 赋值给变量

$str.=$v[''id''].'','';

//再次调用这个函数显示子节点下的同级子节点

findIds($array,$v[''id''],&$str);

 

}

return $str;//返回变量

}

//取得当前节点下的所有同级子节点

function findChild(&$arr,$id){

$childs=array();

foreach ($arr as $k => $v){

if($v[''pid'']== $id){

$childs[]=$v;

}

}

return $childs;

}

php+mysql 实现无限极分类

php+mysql 实现无限极分类

 


php+mysql 实现无限极分类
<pre>
id name pid path

1 电脑 0 0

2 手机 0 0

3 笔记本 1 0-1

4 超级本 3 0-1-3

5 游戏本 3 0-1-3
</pre>


这种方式,假设我们要查询电脑下的所有后代分类,只需要一条 sql 语句:

<pre>
select id,name from category where path like ( select concat(path,''-'',id,''%'') path from category where id=1 );
</pre>


优点:查询容易,效率高,path 字段可以加索引。

缺点:更新节点关系麻烦,需要更新所有后辈的 path 字段。

 

方案一的样例代码:

<pre>
<?php

$addrs = array(

array (''id''=>1, ''name''=>'' 中国 '', ''pid''=>0),

array (''id''=>2, ''name''=>'' 河南 '', ''pid''=>1),

array (''id''=>3, ''name''=>'' 郑州 '', ''pid''=>2),

array (''id''=>4, ''name''=>'' 洛阳 '', ''pid''=>2),

array (''id''=>5, ''name''=>'' 安阳 '', ''pid''=>2),

array (''id''=>6, ''name''=>'' 林州 '', ''pid''=>5),

array (''id''=>7, ''name''=>'' 安阳县 '', ''pid''=>5),

array (''id''=>8, ''name''=>'' 内黄 '', ''pid''=>5),

array (''id''=>9, ''name''=>'' 滑县 '', ''pid''=>5),

array (''id''=>10, ''name''=>'' 城郊乡 '', ''pid''=>6),

array (''id''=>11, ''name''=>'' 湖南 '', ''pid''=>1),

array (''id''=>12, ''name''=>'' 长沙 '', ''pid''=>11),

array (''id''=>13, ''name''=>'' 湘潭 '', ''pid''=>11),

array (''id''=>14, ''name''=>'' 岳麓区 '', ''pid''=>12),

);

// 查询子树 (采用递归方法)

function get_childs($id)

{

global $addrs;

$ret = array();

foreach ($addrs as &$addr) // 此处使用 & 运算符,提高效率

{

if($addr[''pid''] == $id)

{

$addr[''children''] = get_childs($addr[''id'']);

$ret[] = $addr;

}

}

return $ret;

}

// test code

echo ''<pre>'';

print_r( get_childs(1) );

echo ''<hr/>'';

print_r($addrs);
</pre>

今天的关于PHP 无限极分类下拉列表实现php无限极分类的方法的分享已经结束,谢谢您的关注,如果想了解更多关于php 实现无限极分类、php 无限极分类、php 无限极分类 递归函数实现、php+mysql 实现无限极分类的相关知识,请在本站进行查询。

本文标签: