关键词搜索

源码搜索 ×
×

php递归获取分类结构

发布2021-01-25浏览474次

详情内容

PHP递归获取分类结构:

/**
 * 两个大类:电脑、手机
 * --手机{三星Glaxy,IphoneX,华为荣耀}
 * --电脑{Dell,Lenovo,IBM}
 */
$data = array(
    array('id' => 1, 'name' => '手机', 'pid' => 0),
    array('id' => 2, 'name' => '三星Glaxy', 'pid' => 1),
    array('id' => 3, 'name' => 'IphoneX', 'pid' => 1),
    array('id' => 4, 'name' => '华为荣耀', 'pid' => 1),
    array('id' => 5, 'name' => '电脑', 'pid' => 0),
    array('id' => 6, 'name' => 'Dell', 'pid' => 5),
    array('id' => 7, 'name' => 'Lenovo', 'pid' => 5),
    array('id' => 8, 'name' => 'IBM', 'pid' => 5)
);

/**
 * 递归获取结构树
 * @param  array $data  数据源
 * @param  integer $pid 父类id
 * @param  integer $level 深度
 * @return array 组装好的树
 */
function get_tree($data, $pid = 0, $level = 0) {
    static $tree = array();
    foreach ($data as $key => $row) {
        if ($row['pid'] == $pid) {
            $row['level'] = $level;
            $tree[] = $row;
            unset($data[$key]); //进入树结构后,接下里要查的就只是它的子类了,所以从$data中删除,减少后面查询次数
            get_tree($data, $row['id'], $level + 1);
        }
    }
    return $tree;
}

/**
 * 输出树结构
 * @param  array 数据源
 * @return void
 */
function echo_tree($tree) {
    foreach ($tree as $row) {
        for ($i = $row['level']; $i > 0; $i--) {
            echo '|----';
        }
        echo $row['name'];
        echo '<br>';
    }
}

$tree = get_tree($data, 0, 0);
var_dump($tree);
echo "<hr>";
echo_tree($tree);
echo "<\n>";

    执行结果:

    array(8) {
      [0]=>
      array(4) {
        ["id"]=>
        int(1)
        ["name"]=>
        string(6) "手机"
        ["pid"]=>
        int(0)
        ["level"]=>
        int(0)
      }
      [1]=>
      array(4) {
        ["id"]=>
        int(2)
        ["name"]=>
        string(11) "三星Glaxy"
        ["pid"]=>
        int(1)
        ["level"]=>
        int(1)
      }
      [2]=>
      array(4) {
        ["id"]=>
        int(3)
        ["name"]=>
        string(7) "IphoneX"
        ["pid"]=>
        int(1)
        ["level"]=>
        int(1)
      }
      [3]=>
      array(4) {
        ["id"]=>
        int(4)
        ["name"]=>
        string(12) "华为荣耀"
        ["pid"]=>
        int(1)
        ["level"]=>
        int(1)
      }
      [4]=>
      array(4) {
        ["id"]=>
        int(5)
        ["name"]=>
        string(6) "电脑"
        ["pid"]=>
        int(0)
        ["level"]=>
        int(0)
      }
      [5]=>
      array(4) {
        ["id"]=>
        int(6)
        ["name"]=>
        string(4) "Dell"
        ["pid"]=>
        int(5)
        ["level"]=>
        int(1)
      }
      [6]=>
      array(4) {
        ["id"]=>
        int(7)
        ["name"]=>
        string(6) "Lenovo"
        ["pid"]=>
        int(5)
        ["level"]=>
        int(1)
      }
      [7]=>
      array(4) {
        ["id"]=>
        int(8)
        ["name"]=>
        string(3) "IBM"
        ["pid"]=>
        int(5)
        ["level"]=>
        int(1)
      }
    }
    
      57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90

    输出树结构:
    在这里插入图片描述


    获取子树:

    /**
     * 获取子树
     * @param $array
     * @param int $id
     * @return array
     */
     function getTree($array, $id=0)
    {
        $tree = array();
        foreach ($array as $key => $value) {
            if (in_array($id, explode(',',$value['pid']))) {
                $value['children'] = getTree($array, $value['id']);
                if (!$value['children']) {
                    unset($value['children']);
                }
                $tree[] = $value;
            }
        }
        return $tree;
    }
    
    $tree2 = getTree($data, 0);
    var_dump($tree2);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    执行结果:

    array(2) {
      [0]=>
      array(4) {
        ["id"]=>
        int(1)
        ["name"]=>
        string(6) "手机"
        ["pid"]=>
        int(0)
        ["children"]=>
        array(3) {
          [0]=>
          array(3) {
            ["id"]=>
            int(2)
            ["name"]=>
            string(11) "三星Glaxy"
            ["pid"]=>
            int(1)
          }
          [1]=>
          array(3) {
            ["id"]=>
            int(3)
            ["name"]=>
            string(7) "IphoneX"
            ["pid"]=>
            int(1)
          }
          [2]=>
          array(3) {
            ["id"]=>
            int(4)
            ["name"]=>
            string(12) "华为荣耀"
            ["pid"]=>
            int(1)
          }
        }
      }
      [1]=>
      array(4) {
        ["id"]=>
        int(5)
        ["name"]=>
        string(6) "电脑"
        ["pid"]=>
        int(0)
        ["children"]=>
        array(3) {
          [0]=>
          array(3) {
            ["id"]=>
            int(6)
            ["name"]=>
            string(4) "Dell"
            ["pid"]=>
            int(5)
          }
          [1]=>
          array(3) {
            ["id"]=>
            int(7)
            ["name"]=>
            string(6) "Lenovo"
            ["pid"]=>
            int(5)
          }
          [2]=>
          array(3) {
            ["id"]=>
            int(8)
            ["name"]=>
            string(3) "IBM"
            ["pid"]=>
            int(5)
          }
        }
      }
    }
    
      57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80

    通过递归返回层级数组:

    /**
     * 根据id通过递归返回层级数组
     * @param $lists
     * @param $id
     * @return array
     */
     function getChildren($lists, $id) {
        $list = [];
        $i =  0;
        foreach($lists as $value) {
            if(in_array($id, explode(',',$value['pid']))) {
                $list[$i] = $value;
                $list[$i]['children'] = getChildren($lists, $value['id']);
            }
            $i++;
        }
        if($list) {
            $list = array_values($list);
            return $list;
        } else {
            return [];
        }
    }
    
    $tree3 = getChildren($data, 0);
    var_dump($tree3);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    执行结果:

    array(2) {
      [0]=>
      array(4) {
        ["id"]=>
        int(1)
        ["name"]=>
        string(6) "手机"
        ["pid"]=>
        int(0)
        ["children"]=>
        array(3) {
          [0]=>
          array(4) {
            ["id"]=>
            int(2)
            ["name"]=>
            string(11) "三星Glaxy"
            ["pid"]=>
            int(1)
            ["children"]=>
            array(0) {
            }
          }
          [1]=>
          array(4) {
            ["id"]=>
            int(3)
            ["name"]=>
            string(7) "IphoneX"
            ["pid"]=>
            int(1)
            ["children"]=>
            array(0) {
            }
          }
          [2]=>
          array(4) {
            ["id"]=>
            int(4)
            ["name"]=>
            string(12) "华为荣耀"
            ["pid"]=>
            int(1)
            ["children"]=>
            array(0) {
            }
          }
        }
      }
      [1]=>
      array(4) {
        ["id"]=>
        int(5)
        ["name"]=>
        string(6) "电脑"
        ["pid"]=>
        int(0)
        ["children"]=>
        array(3) {
          [0]=>
          array(4) {
            ["id"]=>
            int(6)
            ["name"]=>
            string(4) "Dell"
            ["pid"]=>
            int(5)
            ["children"]=>
            array(0) {
            }
          }
          [1]=>
          array(4) {
            ["id"]=>
            int(7)
            ["name"]=>
            string(6) "Lenovo"
            ["pid"]=>
            int(5)
            ["children"]=>
            array(0) {
            }
          }
          [2]=>
          array(4) {
            ["id"]=>
            int(8)
            ["name"]=>
            string(3) "IBM"
            ["pid"]=>
            int(5)
            ["children"]=>
            array(0) {
            }
          }
        }
      }
    }
    
      57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98

    参考文章地址:

    相关技术文章

    点击QQ咨询
    开通会员
    返回顶部
    ×
    微信扫码支付
    微信扫码支付
    确定支付下载
    请使用微信描二维码支付
    ×

    提示信息

    ×

    选择支付方式

    • 微信支付
    • 支付宝付款
    确定支付下载