You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过解析分隔键将扁平关联数组转换为多维数组?

把Laravel风格的扁平点分隔键数组转成多维数组

嘿,我刚好在项目里处理过一模一样的需求!其实核心思路你已经摸到了——用explode('.', $key)拆分键路径,接下来就是通过引用一步步把值“塞”到多维数组的对应层级里就行,我给你写个实用的实现方案:

核心实现函数

这个函数可以直接拿来用,逻辑清晰还能处理各种嵌套场景:

function convertFlatToMultidimensional(array $flatArray): array
{
    $multidimensional = [];

    foreach ($flatArray as $key => $value) {
        // 拆分键为层级路径数组
        $keySegments = explode('.', $key);
        // 用引用跟踪当前操作的数组层级
        $currentLevel = &$multidimensional;

        foreach ($keySegments as $index => $segment) {
            // 如果是最后一个层级,直接赋值
            if ($index === count($keySegments) - 1) {
                $currentLevel[$segment] = $value;
            } else {
                // 若当前层级不存在该键,先初始化为空数组
                if (!isset($currentLevel[$segment]) || !is_array($currentLevel[$segment])) {
                    $currentLevel[$segment] = [];
                }
                // 移动引用到下一层级
                $currentLevel = &$currentLevel[$segment];
            }
        }
        // 释放引用,避免后续循环污染数组
        unset($currentLevel);
    }

    return $multidimensional;
}

怎么用?举个例子

假设你的扁平数组是这样的:

$flatInput = [
    'test1.test2.test3' => 'result',
    'category.slug' => 'the_slug',
    'user.profile.name' => 'John Doe',
    'user.age' => 30
];

调用函数后:

$multiArray = convertFlatToMultidimensional($flatInput);

得到的多维数组就是:

[
    'test1' => [
        'test2' => [
            'test3' => 'result'
        ]
    ],
    'category' => [
        'slug' => 'the_slug'
    ],
    'user' => [
        'profile' => [
            'name' => 'John Doe'
        ],
        'age' => 30
    ]
]

小细节说明

  • 用引用的好处是不用递归,效率更高,而且能直接操作数组的深层结构;
  • 最后unset($currentLevel)很重要,不然下一次循环的引用会指向之前的层级,导致数组结构混乱;
  • 如果遇到重复的路径(比如同时有test1.test2=foo和test1.test2.test3=bar),函数会自动把test1.test2从字符串转成数组,符合Laravel请求参数的解析逻辑。

内容的提问来源于stack exchange,提问作者user7856768

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:37:45