如何在 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 中展开多维数组(原始键访问路径存储为单个键)?的主要内容,如果未能解决你的问题,请参考以下文章