PHP中如何将下划线分隔键的数组转为多维数组?
PHP下划线分隔键数组转嵌套多维数组并输出JSON
直接上可运行的解决方案,核心是通过迭代方式将下划线分割的键拆解为嵌套层级,同时自动处理数字索引:
function flattenToNested(array $flatArray): array { $nested = []; foreach ($flatArray as $key => $value) { $keys = explode('_', $key); $current = &$nested; foreach ($keys as $index => $segment) { // 处理数字索引(比如elements_0里的0) if (ctype_digit($segment)) { $segment = (int)$segment; if (!isset($current[$segment]) || !is_array($current[$segment])) { $current[$segment] = []; } } else { if (!isset($current[$segment]) || !is_array($current[$segment])) { $current[$segment] = []; } } // 最后一个片段直接赋值,否则继续深入层级 if ($index === count($keys) - 1) { $current[$segment] = $value; } else { $current = &$current[$segment]; } } unset($current); // 释放引用,避免后续循环污染 } return $nested; } // 示例输入 $input = [ 'elements_0_image' => 'img1.jpg', 'elements_0_title' => 'Title 1', 'elements_1_image' => 'img2.jpg', 'elements_1_description' => 'Desc 2', 'settings_theme' => 'dark', 'settings_layout_columns' => 3 ]; // 转换为嵌套数组 $nestedArray = flattenToNested($input); // 输出格式化后的JSON echo json_encode($nestedArray, JSON_PRETTY_PRINT);
输出结果
{ "elements": [ { "image": "img1.jpg", "title": "Title 1" }, { "image": "img2.jpg", "description": "Desc 2" } ], "settings": { "theme": "dark", "layout": { "columns": 3 } } }
关键逻辑说明
- 键拆分:用
explode('_', $key)把下划线分隔的键拆成层级片段,比如elements_0_image拆成['elements', '0', 'image'] - 数字索引处理:通过
ctype_digit判断片段是否为数字,转成整数后作为数组索引,自动生成有序数组 - 引用遍历:用引用
&$current逐层深入嵌套数组,精准定位赋值位置 - 引用释放:每次循环后释放引用,防止后续循环修改错误层级
内容的提问来源于stack exchange,提问作者Tinismo
相关产品推荐
相关产品推荐

