【发布时间】: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 的情况下解决这个问题,即直接设置$out? val 来自用户输入,因此在这种情况下使用eval 显然是非常不安全的。
感谢您的建议。
【问题讨论】:
标签: php arrays recursion multidimensional-array eval