如何通过解析分隔键将扁平关联数组转换为多维数组?
把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
相关产品推荐
相关产品推荐

