PHP无限分类查找

如下图:

clipboard.png

parent_id为0的表示第一级,我现在传递了一个第一级的id(主键),怎么查找到该第一级下面所有所属的子级,要求获取的子级的名称和子级的id,我尝试写了很多,一直不成功。希望有大神帮忙一下,多谢多谢。

阅读 4.7k
5 个回答

多谢邀请:-D,已经有很多答案了,还是贴上我的代码咯:

<?php

$search_type = array(
  array('id'=>1,'name'=>"一级a",'parent_id'=>0),
  array('id'=>2,'name'=>"一级b",'parent_id'=>0),
  array('id'=>3,'name'=>"二级a",'parent_id'=>1),
  array('id'=>4,'name'=>"二级b",'parent_id'=>1),
  array('id'=>5,'name'=>"二级c",'parent_id'=>1),
  array('id'=>6,'name'=>"三级a",'parent_id'=>5),
  array('id'=>7,'name'=>"三级b",'parent_id'=>5),
  array('id'=>8,'name'=>"四级a",'parent_id'=>7),
  array('id'=>9,'name'=>"三级c",'parent_id'=>3),
  array('id'=>10,'name'=>"四级b",'parent_id'=>7),
  array('id'=>11,'name'=>"三级d",'parent_id'=>2),
  array('id'=>12,'name'=>"四级c",'parent_id'=>11),
  array('id'=>13,'name'=>"四级d",'parent_id'=>11),
  array('id'=>14,'name'=>"三级e",'parent_id'=>2),
  array('id'=>15,'name'=>"三级f",'parent_id'=>14)
);

// 相当于 select * from search_type where parent_id = 0 的结果
function select_where_parent_id( $parent_id, $data_source ) {
    $results = array();
    foreach ($data_source as $value) {
        if( $value['parent_id'] == $parent_id ) {
            $results[] = $value;
        }
    }
    return $results;
}

$childs = array();

// &$childs : 结果对象引用
// $parent_id : 父节点id
// $search : 查询对象数据
// $index : 递推深度,方便控制多少层
function get_type(&$childs, $parent_id, $search, $index) {
    $result = select_where_parent_id( $parent_id, $search );
    if( !empty($result) ) {
        $childs[$parent_id] = $result;
        foreach ($result as $value) {
            get_type( $childs, $value['id'], $search, ++$index );
        }
    }
}


get_type($childs, 0, $search_type, 1);
echo json_encode($childs);

递归吧,写了一个不知道对不对,楼下大神请批判

function getLevel($ids)
{
    // 从第二级开始算
    static $currLevel = 2;
    static $rows = [];
    if(empty($ids)) return $rows;
    $insql = "'".implode(",",$ids)."'";
    $sql = "select id,name,level from level where parent_id in $insql and level =         $currLevel";
    $st = $pdo->prepare($sql);
    $st->execute();
    $rows[$currLevel] = $st->fetchAll();
    getLevel($st->fetchColumn(0));
    $currLevel++;
}

getLevel(1);
function unlimitedForLayer($cate, $child_name = 'child' , $pid_name = 'pid' , $id_name = 'id',$pid = 0){
    $arr = array();
    foreach ($cate as $v){
        if ($v[$pid_name] == $pid){
            $v[$child_name] = unlimitedForLayer($cate,$child_name,$pid_name,$id_name,$v[$id_name]);
            $arr[] = $v;
        }
    }
    return $arr;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题