Rev*_*ant 4 php arrays multidimensional-array
我有一个数组:
$array = [
"main;header;up" => "main_header_up value",
"main;header;bottom" => "main_header_bottom value",
"main;bottom" => "main_bottom value",
"main;footer;right;top" => "main_footer_right_top value"
];
Run Code Online (Sandbox Code Playgroud)
我想得到的是将数组键分解为多维数组但保留值和结果应该等效于此数组:
$array = [
"main" => [
"header" => [
"up" => "main_header_up value",
"bottom" => "main_header_bottom value"
],
"bottom" => ["main_bottom value"],
"footer" => [
"right" => [
"top" => "main_footer_right_top value
]
]
]
];
Run Code Online (Sandbox Code Playgroud)
我想我应该声明数量;
不是预定的.可能没有,或者密钥/索引中可能有10个(或更多).
有没有优雅的方法来实现这一目标?
Abr*_*ver 10
这是我用于这样的事情:
$result = array();
foreach($array as $path => $value) {
$temp = &$result;
foreach(explode(';', $path) as $key) {
$temp =& $temp[$key];
}
$temp = $value;
}
print_r($result);
Run Code Online (Sandbox Code Playgroud)
explode()
键;
我的答案如何编写getter/setter以通过键名访问多级数组?如果您需要某些功能来执行此操作,可能会有帮助
这是解决方案
<?php
$array = [
"main;header;up" => "main_header_up value",
"main;header;bottom" => "main_header_bottom value",
"main;bottom" => "main_bottom value",
"main;footer;right;top" => "main_footer_right_top value"
];
$result = [];
foreach ($array as $implodedKeys => $value) {
$keys = array_reverse(explode(';', $implodedKeys));
$tmp = $value;
foreach ($keys as $key) {
$tmp = [$key => $tmp];
}
$result = array_merge_recursive($result, $tmp);
}
var_dump($result);
Run Code Online (Sandbox Code Playgroud)
一些解释:首先迭代你给出的数组,从每一行中分解键并反转它们.现在我们可以迭代这些键并从内到外构建每个数组.最后,您可以递归地将其与结果合并.这不是最有效的解决方案,但表明有很多方法可以解决问题