【问题标题】:Recursively Reformat Prefixed Array [duplicate]递归重新格式化前缀数组[重复]
【发布时间】:2017-06-28 15:17:02
【问题描述】:

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

[
    '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 arrays


【解决方案1】:

另一种解决方案

$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;
    }
}

【讨论】:

    【解决方案2】:

    试试下面的代码:

    <?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);
    

    【讨论】:

    • 谢谢这成功了。我暂时将其保留为开放状态,但如果没有人提出更好的解决方案,我会将其标记为答案。
    猜你喜欢
    • 2012-06-17
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 2022-12-05
    相关资源
    最近更新 更多