一般为了方便管理 redis 缓存,我们通过 : 来分隔不同的 key 来进行存储缓存,这样方便查看。
例如:
1 2 3 | game:upload_role:1000 game:member_info:2000 game:member_info:state_info:3000 |
上面的这种结构在 Redis Desktop Manager 中就会显示如下:
我们可以通过 keys 命令来获取 redis 里的所有 key。但这些 key 是没有层次的,如何生成?
只能通过 : 分隔符来处理各 key 的上下层关系。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | function relationCache( $keys , & $index , & $index_tree ) { $result = []; if ( $keys ) { foreach ( $keys as $key ) { $arr = explode ( ':' , $key ); $len = count ( $arr ); for ( $ix = 0; $ix < $len ; $ix ++) { $cur_key = implode( ':' , array_slice ( $arr , 0, $ix + 1)); if (!isset( $index_tree [ $cur_key ])) { $index_tree [ $cur_key ] = $index ++; $pid = 0; if ( $ix >= 1) { $pre_key = implode( ':' , array_slice ( $arr , 0, $ix )); $pid = $index_tree [ $pre_key ]; } $result [] = [ 'id' => $index_tree [ $cur_key ], 'pid' => $pid , 'name' => $arr [ $ix ], 'key' => $cur_key , ]; } } } } return $result ; } |
然后生成树型的函数如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | function genTree( $items , $id = 'id' , $pid = 'pid' , $son = 'child' ) { $tree = array (); $tmpMap = array (); foreach ( $items as $item ) { $tmpMap [ $item [ $id ]] = $item ; } foreach ( $items as $item ) { if (isset( $tmpMap [ $item [ $pid ]])) { $tmpMap [ $item [ $pid ]][ $son ][] = & $tmpMap [ $item [ $id ]]; } else { $tree [] = & $tmpMap [ $item [ $id ]]; } } unset( $tmpMap ); return $tree ; } |
使用如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | $keys = [ 'game:upload_role:1000' , 'game:member_info:2000' , 'game:member_info:state_info:3000' , ]; //索引 $index = 1; //索引树 $index_tree = []; //注意,如果想多次调用relationCache,并共享索引,请通过外部传参的方式 $result = relationCache( $keys , $index , $index_tree ); $result = genTree( $result , 'id' , 'pid' , 'children' ); echo '<pre>' ; print_r( $result ); |
这样生成的结果,通过json_encode就可以使用 zTree 来显示了。
版权声明:博主文章,可以不经博主允许随意转载,随意修改,知识是用来传播的。
分类:
php
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决