如何在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
)
)