【问题标题】:PHP - Automatically creating a multi-dimensional arrayPHP - 自动创建多维数组
【发布时间】:2011-04-02 07:11:06
【问题描述】:

所以这是输入:

$in['a--b--c--d'] = 'value';

以及所需的输出:

$out['a']['b']['c']['d'] = 'value';

有什么想法吗?我试过下面的代码没有任何运气......


$in['a--b--c--d'] = 'value';
// $str = "a']['b']['c']['d";
$str = implode("']['", explode('--', key($in)));
${"out['$str']"} = 'value';

【问题讨论】:

  • 我怀疑你的意思是“结果”而不是“输出”。

标签: php multidimensional-array associative-array


【解决方案1】:
$temp = &$out = array();
$keys = explode('--', 'a--b--c--d');
foreach ($keys as $key) {
    $temp[$key] = array();    
    $temp = &$temp[$key];
}
$temp = 'value';
echo $out['a']['b']['c']['d']; // this will print 'value'

在上面的代码中,我为每个键创建了一个数组,并使用 $temp 来引用最后创建的数组。当我用完键时,我用实际值替换最后一个数组。 请注意,$temp 是对最后创建的、最嵌套的数组的引用。

【讨论】:

    【解决方案2】:

    这似乎是递归的主要候选者。

    基本方法如下:

    1. 创建一个键数组
    2. 为每个键创建一个数组
    3. 当没有更多键时,返回值(而不是数组)

    下面的递归正是这样做的,在每次调用期间都会创建一个新数组,列表中的第一个键被分配为新值的键。在下一步中,如果有剩余键,则重复该过程,但是当没有剩余键时,我们只需返回值。

    $keys = explode('--', key($in));
    
    function arr_to_keys($keys, $val){
        if(count($keys) == 0){
            return $val;
        }
        return array($keys[0] => arr_to_keys(array_slice($keys,1), $val));
    }
    
    $out = arr_to_keys($keys, $in[key($in)]);
    

    对于您的示例,上面的代码将评估为与此等效的代码(但适用于任意数量的-- 分隔项的一般情况):

    $out = array($keys[0] => array($keys[1] => array($keys[2] => array($keys[3] => 'value'))));
    

    或者更明确地说,它构造了以下内容:

    $out = array('a' => array('b' => array('c' => array('d' => 'value'))));
    

    这允许您通过所需的索引访问每个子数组。

    【讨论】:

    • 是的,类似的东西。它值得评论。无论如何 +1。
    • 效果很好!有没有办法使用 ${\'out['a']['b']['c']['d']\'} = 'value'; 创建多维数组?
    • @Matt,你可以使用eval 来做到这一点,但我不推荐它。 eval("\$out['a']['b']['c']['d'] = 'value';") 之类的东西是等价的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多