将平面数组转换为分层的多维数组

Posted

技术标签:

【中文标题】将平面数组转换为分层的多维数组【英文标题】:Transform flat array into a hierarchical, multi-dimensional array 【发布时间】:2011-08-30 14:16:34 【问题描述】:

我有一个带有键值对的标准数组 - 我想使用键将其转换为多维数组。困难似乎是我需要递归循环未知数量的新键并将它们变成多维数组。简而言之,我想要这个:

$val[alfa.xray.uno] = "Some value";    
=> $val['alfa']['xray']['uno'] = "Some value";    

示例: (代码失败,还需要处理 N 维 - 但你明白了..)

$arr['alfa.xray.uno'] = "Alfa X-Ray Uno";
$arr['alfa.yaho.duo'] = "Alfa Yaho Duo";
$arr['beta.xray.uno'] = "Beta X-Ray Uno";
$arr['beta.xray.duo'] = "Beta X-Ray Duo";
$arr['just-me'] = "Root-level item";

print_r( array_flat_to_multidimensional($arr) );

function array_flat_to_multidimensional($arr) 
    foreach($arr as $key=>$val) 
        $key = explode(".",$key);
        for($i=0; $i<count($key); $i++) 
            if($i==0)  $out[$key[$i]] = $val; 
            else if($i==1)  $out[$key[$i-1]][$key[$i]] = $val; 
            else if($i==2)  $out[$key[$i-2]][$key[$i-1]][$key[$i]] = $val; 
            else if($i==3)  $out[$key[$i-3]][$key[$i-2]][$key[$i-1]][$key[$i]] = $val; 
        
    
    return $out;

也许RecursiveArrayIterator 可以解决问题?

【问题讨论】:

【参考方案1】:

您可以使用引用连续迭代并构建嵌套数组结构:

$out = array();
foreach ($arr as $key=>$val) 
    $r = & $out;
    foreach (explode(".", $key) as $key) 
        if (!isset($r[$key])) 
            $r[$key] = array();
        
        $r = & $r[$key];
    
    $r = $val;

return $out;

【讨论】:

开箱即用。谢谢。【参考方案2】:

使用递归卢克

function ins(&$ary, $keys, $val) 
    $keys ? 
        ins($ary[array_shift($keys)], $keys, $val) :
        $ary = $val;


// test

$arr['alfa.xray.uno'] = "Alfa X-Ray Uno";
$arr['alfa.yaho.duo'] = "Alfa Yaho Duo";
$arr['beta.xray.uno'] = "Beta X-Ray Uno";
$arr['beta.xray.duo'] = "Beta X-Ray Duo";
$arr['just-me'] = "Root-level item";

$a = array();
foreach($arr as $k => $v)
    ins($a, explode('.', $k), $v);

print_r($a);

【讨论】:

优秀 - 正是我的想法。可以归结为一种功能吗?【参考方案3】:

您可以在遍历数组层次结构级别时使用reference:

function array_flat_to_multidimensional($arr) 
    $out = array();
    foreach ($arr as $compoundKey => $val) 
        $ref = &$out;
        foreach (explode(".", $compoundKey) as $key) 
            if (!array_key_exists($key, $ref)) $ref[$key] = array();
            $ref = &$ref[$key];
        
        $ref = $val;
    
    unset($ref);
    return $out;

【讨论】:

以上是关于将平面数组转换为分层的多维数组的主要内容,如果未能解决你的问题,请参考以下文章

将c多维数组转换为多维c++向量

将多维数组转换为单个数组

将多维数组转换为一维数组的算法

PHP:将多维数组转换为简单数组

如何将数组列表转换为多维数组

javascript 按照块大小(每个子阵列的元素数)将平面数组分组到多维数组中