创建数据库
CREATE TABLE `mdz_product_category` (
`id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`category_name` varchar(90) NOT NULL DEFAULT '' COMMENT '分类标题',
`category_pid` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '分类父级id',
`category_sort` tinyint(1) unsigned NOT NULL DEFAULT '50' COMMENT '分类排序',
`category_level` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '分类所在等级',
`category_ico` varchar(255) NOT NULL DEFAULT '' COMMENT '分类图标',
`index_display` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否显示到首页,0否,1是',
`status` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '分类状态显示,0正常,1删除',
`create_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
PRIMARY KEY (`id`) USING BTREE,
KEY `parent_id` (`category_pid`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
可以手动插入对应的数据信息
php函数
/*
* 查询分类列表 category_sort 越小越靠前
* @param $param
* return array
* */
public static function getProductCategoryList($product_category_where)
{
return ProductCategory::find()->select('*')->where($product_category_where)->orderBy('category_pid asc,category_sort asc')->asArray()->all() ?: [];
}
/**
* 获取应用列表tree
* @return array
*/
public static function getAllProductCategoryTreeIndex($array)
{
//第一步 构造数据 规范数据内容
$items = array();
foreach ($array as $value) {
$items[$value['id']] = array(
'permission_id' => $value['id'],
'parent_permission_id' => $value['category_pid'],
'text' => $value['category_name'],
'permission_url' => '',
'tag' => '',
'small_icon_name' => $value['category_ico'],
'level' => $value['category_level'],
// 'after_html' => '<span class="button_z"><button type="button" class="btn btn btn-info btn-xs" οnclick="edit(' . $value['id'] . ');">编辑</button> <button type="button" class="btn btn-danger btn-xs" οnclick="del(' . $value['id'] . ');">删除</button></span>',
'after_html' => '<span class="button_z"><i class="fa fa-edit changeData" edit_id="' . $value['id'] . '"></i><i class="fa fa-trash changeStatus" style="margin-left: 5px" title="删除" changeNum="1" del_id="' . $value['id'] . '"></i></span>',
);
}
//第二部 遍历数据 生成树状结构
$tree = array();
foreach ($items as $key => $value) {
//如果parent_permission_id这个节点存在
if (isset($items[$value['parent_permission_id']])) {
//把当前的$value放到parent_permission_id节点的nodes中 注意 这里传递的是引用
$items[$value['parent_permission_id']]['nodes'][] = &$items[$key];
} else {
$tree[] = &$items[$key];
}
}
return $tree;
}
得到数据组内容,并打印
Array
(
[0] => Array
(
[permission_id] => 3
[parent_permission_id] => 0
[text] => 骑行周边
[permission_url] =>
[tag] =>
[small_icon_name] => https://www.qipa250.com/H5002.png
[level] => 0
[after_html] =>
[nodes] => Array
(
[0] => Array
(
[permission_id] => 8
[parent_permission_id] => 3
[text] => 头盔
[permission_url] =>
[tag] =>
[small_icon_name] =>
[level] => 1
[after_html] =>
[nodes] => Array
(
[0] => Array
(
[permission_id] => 32
[parent_permission_id] => 8
[text] => 门店涨头盔
[permission_url] =>
[tag] =>
[small_icon_name] =>
[level] => 2
[after_html] =>
[nodes] => Array
(
[0] => Array
(
[permission_id] => 33
[parent_permission_id] => 32
[text] => 大头盔
[permission_url] =>
[tag] =>
[small_icon_name] =>
[level] => 3
[after_html] =>
)
)
)
)
)
)
)
[1] => Array
(
[permission_id] => 4
[parent_permission_id] => 0
[text] => 车辆配件
[permission_url] =>
[tag] =>
[small_icon_name] => https://www.qipa250.com/PrH018.png
[level] => 0
[after_html] =>
[nodes] => Array
(
[0] => Array
(
[permission_id] => 11
[parent_permission_id] => 4
[text] => 锂电池
[permission_url] =>
[tag] =>
[small_icon_name] =>
[level] => 1
[after_html] =>
)
[1] => Array
(
[permission_id] => 12
[parent_permission_id] => 4
[text] => 充电器
[permission_url] =>
[tag] =>
[small_icon_name] =>
[level] => 1
[after_html] =>
)
)
)
注意:
这个方法的核心在于引用,php变量默认的传值方式是按指传递
也就是说 假如说 遍历顺序是 骑行周边 头盔 当遍历到骑行周边 时 会把骑行周边 放到tree中 遍历到 头盔 时 会把 头盔 放到 骑行周边 的子节点数组中 但是!!! 这会儿的tree数组中 骑行周边 已经放进去了 根据php变量按值传递的规则 你并没有更改tree数组中的 骑行周边 的数据 所以这里用到了引用传递
调用方法
//获取所有分类列表
$product_category_top_where = ' status=0 ';
$product_category_top = self::getProductCategoryList($product_category_top_where);
$product_category_tree = self::getAllProductCategoryTreeIndex($product_category_top);