PHP如何将一维数组按键的/分隔符转换为对应层级的多维数组
方案解答
实现该需求不需要强制使用递归函数,借助PHP的引用特性即可完成更高效、无层级限制的实现,当然递归方案也可正常运行,两种可靠实现如下:
方案1:引用实现(推荐)
利用PHP的引用逐层定位到多维数组的对应层级赋值,无递归栈深度限制,性能更高:
// 转换函数 function flattenToMulti(array $flatArr, string $separator = '/'): array { $result = []; foreach ($flatArr as $key => $val) { $keySegments = explode($separator, $key); $current = &$result; $lastIdx = count($keySegments) - 1; foreach ($keySegments as $idx => $seg) { if ($idx === $lastIdx) { $current[$seg] = $val; break; } if (!isset($current[$seg]) || !is_array($current[$seg])) { $current[$seg] = []; } $current = &$current[$seg]; } } unset($current); // 销毁引用避免后续操作异常 return $result; }
调用示例:
// 你的原始一维数组 $originArr = [ 'Name/First' => 'John', 'Name/Last' => 'Doe', 'Age' => 20, 'Address/Postal/City' => 'New York', 'Address/Postal/Zip' => '10003', 'Address/Billing/City' => 'Los Angeles', 'Phone' => '123456789', 'Foo/Bar/Foo2/Bar2' => 'test', ]; // 转换为多维数组 $multiArr = flattenToMulti($originArr); print_r($multiArr);
输出结果完全匹配你给出的预期格式。
方案2:递归实现(可选)
如果偏好递归写法也可使用,优势是逻辑直观,劣势是受PHP默认递归栈深度(通常100层)限制,层级过深会报错:
function flattenToMultiRecursive(array $flatArr, string $separator = '/'): array { $result = []; foreach ($flatArr as $key => $val) { $keySegments = explode($separator, $key); $result = nestedAssign($result, $keySegments, $val); } return $result; } function nestedAssign(array $nestedArr, array $segments, $val): array { $currentSeg = array_shift($segments); if (empty($segments)) { $nestedArr[$currentSeg] = $val; return $nestedArr; } if (!isset($nestedArr[$currentSeg]) || !is_array($nestedArr[$currentSeg])) { $nestedArr[$currentSeg] = []; } $nestedArr[$currentSeg] = nestedAssign($nestedArr[$currentSeg], $segments, $val); return $nestedArr; }
内容的提问来源于stack exchange,提问作者user2409690
相关产品推荐
相关产品推荐

