递归重新格式化前缀数组



如何将平面数组转换为嵌套数组,其中嵌套键以相同的值为前缀。例如,假设我有以下数组:

[
    'name' => 'a',
    'content' => 'b',
    'author_fullName' => 'c',
    'author_email' => 'd',
    'author_role_name' => 'e'
]

然后数组的输出将是:

[
    'name' => 'a',
    'content' => 'b',
    'author' => [
        'fullName' => 'c',
        'email' => 'd',
        'role' => [
            'name' => 'e'
        ]
    ]
]

理想情况下,我想要一个使用内置数组函数的解决方案,因为我更喜欢函数语法而不是使用 for 循环。我将不胜感激你的帮助。谢谢

尝试以下代码:

<?php
$a = [
 'name' => 'a',
 'content' => 'b',
 'author_fullName' => 'c',
 'author_email' => 'd',
 'author_role_name' => 'e'
];
$finalArray =[];
array_walk($a, function(&$value, $key) use(&$finalArray) {
 $indexes = explode('_',$key);
 foreach ($indexes as $index){
    $finalArray = &$finalArray[$index];
 }
 $finalArray = $value;
});

print_r($finalArray);

另一种解决方案

$delimiter = '_';
$result = [];
foreach($array as $k => $v)
{
    $split = explode($delimiter, $k, 2);//explode only as much as we need
    if(count($split) > 1)
    {
        if(!isset($result[$split[0]]))
        {
            $result[$split[0]] = [];
        }
        //this assumes we're not interested in more than two depths
        //in tandem with the explode limit
        $result[$split[0]][$split[1]] = $v;
    }
    else
    {
        $result[$k] = $v;
    }
}

最新更新