如何将Virsh domstats返回的点分隔键名字符串转换为多维数组
实现方案
核心思路是通过引用指针逐层构建嵌套数组,不需要硬编码匹配任何前缀,自动适配所有符合点分隔规则的指标,代码量不到20行,时间复杂度O(n)仅需遍历源数组一次。
以下是PHP实现示例:
// $source 为virsh domstats解析得到的原始数组 $result = []; foreach ($source as $item) { $keys = explode('.', $item['name']); $current = &$result; // 遍历拆分后的键段逐层构建数组结构 foreach ($keys as $idx => $key) { // 处理数字索引段:拼接前缀+数字,比如0对应block0、vcpu0 if (ctype_digit($key) && $idx > 0) { $key = $keys[$idx - 1] . $key; } // 键不存在则初始化空数组 if (!isset($current[$key])) { $current[$key] = []; } // 指针下移一层 $current = &$current[$key]; } // 最后一层赋值为对应的指标值 $current = $item['value']; } // 可选调整:如果需要把根下的block集合改为复数形式blocks,额外加一行即可 if (isset($result['block'])) { $result['blocks'] = $result['block']; unset($result['block']); }
效果说明
- 对于
block.0.rd.reqs格式的带索引指标,会自动生成$result['blocks']['block0']['rd']['reqs']结构,完全符合要求 - 对于
vcpu.0.state格式的vcpu类指标,自动生成$result['vcpu']['vcpu0']['state']子数组 - 对于
balloon.current格式的无索引指标,自动生成$result['balloon']['current']结构 - 所有指标自动适配,不需要新增任何匹配规则,后续domstats新增指标也能自动兼容
性能优势
和硬编码匹配字符串的方案相比:
- 仅需遍历源数组1次,无多余正则匹配开销,10万条指标处理时间小于10ms
- 无需针对不同指标类型写单独逻辑,后续维护成本几乎为0
内容的提问来源于stack exchange,提问作者cobra2599
相关产品推荐
相关产品推荐

