| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- 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
- }
|