php递归获取分类结构

<?php
error_reporting(E_ALL);
/**
 * 表结构信息
 * CREATE TABLE `crm_admin_structure` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(200) NOT NULL DEFAULT '',
  `pid` int(11) DEFAULT '0',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=68 DEFAULT CHARSET=utf8 COMMENT='部门表';
*/
// 数据库连接参数
$servername = "127.0.0.1";
$username = "xxx";
$password = "xx";
$dbname = "xx";
/**
 * 递归获取结构树
 * @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;
}

/**
 * 字符转换(utf-8 => GBK)
 */
function utfToGbk($data)
{
    return iconv('utf-8', 'GBK', $data);
}
//导出csv文件信息
function exportCsv($data){
    // 文件名,这里都要将utf-8编码转为gbk,要不可能出现乱码现象
    $filename = utfToGbk('导出csv文件.csv');

    // 拼接文件信息,这里注意两点
    // 1、字段与字段之间用逗号分隔开
    // 2、行与行之间需要换行符
    $fileData = utfToGbk('id, name, pid ,备注') . "\n";
    foreach ($data as $value) {
        $str = str_repeat("->", $value['level']);
        $temp = $value['id'] . ',' .$str.$value['name'] . ',' .
                $value['pid'];
        $fileData .= utfToGbk($temp) . "\n";
    }

    // 头信息设置
    header("Content-type:text/csv");
    header("Content-Disposition:attachment;filename=" . $filename);
    header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
    header('Expires:0');
    header('Pragma:public');
    echo $fileData;
    exit;
}

    // 创建连接
    $conn = new mysqli($servername, $username, $password, $dbname);
    // Check connection
    if ($conn->connect_error) {
        die("连接失败: " . $conn->connect_error);
    } 
     
    $sql = "SELECT id, name, pid FROM crm_admin_structure";
    $ret = $conn->query($sql);
    // var_dump($ret);die;
    if ($ret->num_rows > 0) {
    // 输出数据
        while($vv = $ret->fetch_assoc()) {
            $result[] = $vv;
        }
    } else {
        echo "0 结果";
    }
    // var_dump($result);die;


    $nestedTree = get_tree($result);

    exportCsv($nestedTree);

?>
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容