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

发布于 2024-11-09 04:09:38 字数 1142 浏览 0 评论 0原文

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

$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 可以解决问题吗?

I have a standard array with key-value pairs - and I want to use the keys to transform it into a multi-dimensional array. The difficulty seems to be that I need to loop recursively the unknown number of new keys and turn them into a multi-dimensional array. In short, I want this:

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

Example:
(The code fails and also needs to handle N dimensions - but you get the idea..)

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

Perhaps RecursiveArrayIterator will do the trick?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

秋日私语 2024-11-16 04:09:38

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

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

You could use references to successively iterate through and build up the nested array structure:

$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;
风流物 2024-11-16 04:09:38

使用递归卢克

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

use the recursion Luke

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);
贪了杯 2024-11-16 04:09:38

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

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

You can use a reference while walking though the array hierarchy levels:

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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文