Files
gfast/library/utils/slice_tree.go
T
2020-01-16 18:08:46 +08:00

83 lines
2.0 KiB
Go

package utils
import (
"fmt"
"github.com/gogf/gf/database/gdb"
"github.com/gogf/gf/util/gconv"
"strings"
)
//有层级关系的数组,父级-》子级 排序
func ParentSonSort(list gdb.List, params ...interface{}) gdb.List {
args := make([]interface{}, 8)
for k, v := range params {
if k == 8 {
break
}
args[k] = v
}
var (
pid int //父级id
level int //层级数
fieldName string //父级id键名
id string //id键名
levelName string //层级名称
title string //标题名称
breaks int //中断层级
prefixStr string //字符串前缀
)
pid = gconv.Int(GetSliceByKey(args, 0, 0))
level = gconv.Int(GetSliceByKey(args, 1, 0))
fieldName = gconv.String(GetSliceByKey(args, 2, "pid"))
id = gconv.String(GetSliceByKey(args, 3, "id"))
levelName = gconv.String(GetSliceByKey(args, 4, "flg"))
title = gconv.String(GetSliceByKey(args, 5, "title"))
breaks = gconv.Int(GetSliceByKey(args, 6, -1))
prefixStr = gconv.String(GetSliceByKey(args, 7, "  "))
//定义一个新slice用于返回
var returnSlice gdb.List
for _, v := range list {
if pid == gconv.Int(v[fieldName]) {
v[levelName] = level
levelClone := level
titlePrefix := ""
for {
if levelClone < 0 {
break
}
titlePrefix = strings.Repeat(prefixStr, 2)
levelClone--
}
titlePrefix += "├"
if level == 0 {
v["title_prefix"] = ""
} else {
v["title_prefix"] = titlePrefix
}
v["title_show"] = fmt.Sprintf("%s%s", v["title_prefix"], v[title])
returnSlice = append(returnSlice, v)
if breaks != -1 && breaks == level {
continue
}
args[0] = v[id]
args[1] = level + 1
newSlice2 := ParentSonSort(list, args...)
if len(newSlice2) > 0 {
returnSlice = append(returnSlice, newSlice2...)
}
}
}
return returnSlice
}
//获取切片里的值 若为nil 可设置默认值val
func GetSliceByKey(args []interface{}, key int, val interface{}) interface{} {
var value interface{}
if args[key] != nil {
value = args[key]
} else {
value = val
}
return value
}