mirror of
https://github.com/tiger1103/gfast.git
synced 2026-09-21 10:12:59 +00:00
83 lines
2.0 KiB
Go
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
|
|
}
|