如何在 PHP 中展开多维数组(原始键访问路径存储为单个键)?

Posted

技术标签:

【中文标题】如何在 PHP 中展开多维数组(原始键访问路径存储为单个键)?【英文标题】:How to unflatten a multidimensional array (where original key access path is stored as a single key) in PHP? 【发布时间】:2012-07-16 03:31:53 【问题描述】:

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

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,它将反转该过程(例如,如果键中有一个.,则创建一个子数组)。有什么想法吗?

【问题讨论】:

而不是这样做是有实际原因需要这个构建/重建数组函数吗?必须是您未描述的问题的更好解决方案。 从 explode() php.net/manual/en/function.explode.php 开始,使用 .作为分隔符 【参考方案1】:

使用parse_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/>";

输出:

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
        )

)

【讨论】:

这是parse_str 的绝佳用法!我真的不会这么想。谢谢! 此解决方案的问题 -> 它将值转换为字符串,因此如果您想要展平/取消展平整数数组,结果将与原始数组不同: unflatten(flatten([[ 1,2],[3,4])) === [["1","2"],["3","4"]] != 原始数据 这是一段非常好的代码,只是 parse_str 的语法从 PHP 8.0 发生了变化。存储结果的第二个参数是强制性的。用此代码替换该行似乎可以解决问题:parse_str('result['.str_replace('.','][',$key)."]=".$value,$result2); $result = array_replace_recursive($result, $result2['result']);。我正在使用 flatten/unflatten 将 json 数据保存并检索到 mysql 中。

以上是关于如何在 PHP 中展开多维数组(原始键访问路径存储为单个键)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在php中获取多维数组中动态的第一个键? [复制]

如何在 PHP 中循环遍历多维数组并按名称递归删除键?

PHP学习笔记--数组

具有未知键数的多维数组上的PHP Array_intersect

PHP - 在多维数组中查找键

如何在 javascript 中访问多维 PHP 数组作为 json 编码的变体?