【问题标题】:Create multidimensional array recursively递归创建多维数组
【发布时间】:2014-07-01 10:11:13
【问题描述】:

原始数组如下所示:

$array = array(
    array(
        'key' => 'key1',
        'val' => 'val1'
    ),
    array(
        'key' => 'key2:subkey1',
        'val' => 'val2'
    ),
    array(
        'key' => 'key3:subkey2',
        'val' => 'val3'
    ),
    array(
        'key' => 'key3:subkey3:subsubkey1',
        'val' => 'val4'
    ),
    array(
        'key' => 'key3:subkey3:subsubkey2',
        'val' => 'val5'
    ),
    array(
        'key' => 'key3:subkey3:subsubkey3',
        'val' => 'val6'
    )
);

我想根据原来的数组生成一个新数组,如下所示:

$result = array(
    'key1' => 'val1',
    'key2' => array(
        'subkey1' => 'val2'
    ),
    'key3' => array(
        'subkey2' => 'val3',
        'subkey3' => array(
            'subsubkey1' => 'val4',
            'subsubkey2' => 'val5',
            'subsubkey3' => 'val6'            
        )
    )
);

该算法应该能够处理任何深度的参考数组。 到目前为止我尝试过的方法有效,但由于各种原因我对使用eval 不满意:

function convert($array) {
    $out = array();
    foreach ($array as $data) {
        $key = $data['key'];
        $pos = strpos($key, ':');
        if ($pos === false) {
            $out[$key] = $data['val'];
        } else {
            $split = explode(":", $key);
            eval("\$out['" . implode("']['", $split) . "'] = '" . $data['val'] . "';");
        }
    }
    return $out;
}

有没有办法在不诉诸eval 的情况下解决这个问题,即直接设置$outval 来自用户输入,因此在这种情况下使用eval 显然是非常不安全的。

感谢您的建议。

【问题讨论】:

    标签: php arrays recursion multidimensional-array eval


    【解决方案1】:
    function convert($array) {
        $out = array();
        foreach ($array as $data) {
            $key = $data['key'];
            $value = $data['val'];
            $helper = &$out;
            foreach (explode(':', $key) as $i) {
                $helper = &$helper[$i];
            }
            $helper = $value;
        }
    
        return $out;
    }
    

    我花了一段时间才弄清楚该怎么做。参考也许是实现它的最佳方式。

    $helper-变量是对我们完成后要返回的$out-array 的临时引用。它用冒号分隔每个键作为分隔符并遍历每个单独的键。在每次迭代中,我们都会将助手引用更改为下一个键。

    一个例子:

    $out = array();
    
    explode(':', $key) => array('key3', 'subkey3', 'subsubkey1');
    $helper = &$out;
    
    // foreach loop starts
    $helper = $helper['key3']; // Iteration 1
    $helper = $helper['key3']['subkey3']; // Iteration 2
    $helper = $helper['key3']['subkey3']['subsubkey1']; // Iteration 3
    

    我希望你明白它是如何工作的。

    【讨论】:

    • 干得好。它怀疑它应该是一个参考,我自己无法让它工作。是的,我了解它是如何工作的。非常干净和简单的解决方案。 @silkfire 您是第一个使用几乎相同解决方案的人,但由于描述和干净的功能块,我接受了这个。谢谢大家!
    【解决方案2】:

    试试这个简洁的代码:

    $array = array(
                   array(
                         'key' => 'key1',
                         'val' => 'val1'
                        ),
                   array(
                         'key' => 'key2:subkey1',
                         'val' => 'val2'
                        ),
                   array(
                         'key' => 'key3:subkey2',
                         'val' => 'val3'
                        ),
                   array(
                         'key' => 'key3:subkey3:subsubkey1',
                         'val' => 'val4'
                        ),
                   array(
                         'key' => 'key3:subkey3:subsubkey2',
                         'val' => 'val5'
                        ),
                   array(
                         'key' => 'key3:subkey3:subsubkey3',
                         'val' => 'val6'
                        )
                  );
    
    $new_array = array();
    
    foreach($array as $element) {
        $temp = &$new_array;
    
        foreach(explode(':', $element['key']) as $key) {
            $temp = &$temp[$key];
        }
    
        $temp = $element['val'];
    }
    
    unset($temp);
    
    var_dump($new_array);
    

    【讨论】:

      猜你喜欢
      • 2010-11-27
      • 2010-12-08
      • 2011-11-13
      • 2017-12-28
      • 2017-11-28
      • 2016-03-27
      • 2019-02-20
      • 2017-02-26
      • 1970-01-01
      相关资源
      最近更新 更多