如何在PHP中取消多维数组(原始密钥访问路径存储为单个密钥)的平台化?

如何在PHP中取消多维数组(原始密钥访问路径存储为单个密钥)的平台化?,php,multidimensional-array,flatten,Php,Multidimensional Array,Flatten,我使用以下函数展平多维数组: function flatten($array, $prefix = '') { $result = array(); foreach($array as $key=>$value) { if(is_array($value)) { $result = $result + flatten($value, $prefix . $key . '.'); } else {

我使用以下函数展平多维数组:

function flatten($array, $prefix = '') {
    $result = array();
    foreach($array as $key=>$value) {
        if(is_array($value)) {
            $result = $result + flatten($value, $prefix . $key . '.');
        }
        else {
            $result[$prefix . $key] = $value;
        }
    }
    return $result;
}

我想创建一个匹配函数,
unflatten
,该函数将反转该过程(例如,如果键中有一个
,则创建一个子数组)。有什么想法吗?

使用
parse\u str
来完成这项工作。只需在下面进行尝试

function flatten($array, $prefix = '') {
    $result = array();
    foreach($array as $key=>$value) {
        if(is_array($value)) {
            $result = $result + flatten($value, $prefix . $key . '.');
        }
        else {
            $result[$prefix . $key] = $value;
        }
    }
    return $result;
}

function unflatten($array,$prefix = '')
{
    $result = array();
    foreach($array as $key=>$value)
    {
        if(!empty($prefix))
        {
            $key = preg_replace('#^'.preg_quote($prefix).'#','',$key);
        }
        if(strpos($key,'.') !== false)
        {
            parse_str('result['.str_replace('.','][',$key)."]=".$value);
        }
        else $result[$key] = $value;
    }
    return $result;
}
$source    = array('a'=>'d','b',array('a'=>'c','d'));
$flattened = flatten($source,'__');
echo "<pre>";
echo "source array :<br/>";
print_r($source);
echo "flatten result:<br/>";
print_r($flattened);
echo "unflatten result:<br/>";
print_r(unflatten($flattened,'__'));
echo "<pre/>";

不是这样做,而是需要此构建/重建阵列函数的实际原因吗?对于您没有描述的问题,必须是一个更好的解决方案。请使用。作为定界符,这是对
parse\u str
的出色使用!我真的不会想到这一点。谢谢此解决方案存在问题->它将值转换为字符串,因此,如果要展平/取消展平整数数组,结果将与原始数组不同:取消展平(展平([1,2],[3,4])===[[“1”,“2”],[“3”,“4”]!=原始数据
source array :
Array
(
    [a] => d
    [0] => b
    [1] => Array
        (
            [a] => c
            [0] => d
        )

)
flatten result:
Array
(
    [__a] => d
    [__0] => b
    [__1.a] => c
    [__1.0] => d
)
unflatten result:
Array
(
    [a] => d
    [0] => b
    [1] => Array
        (
            [a] => c
            [0] => d
        )

)