【问题标题】:Convert an array to multidimensional array将数组转换为多维数组
【发布时间】:2018-02-24 23:24:31
【问题描述】:
我有一个看起来像这样的数组:
array:2 [
"test1_test2_test3" => "result"
"category_slug" => "the_slug"
]
我需要做的是把它转换成一个看起来像这样的多维数组:
array:2 [
"test1" => [
"test2" => [
"test3" => "result"
]
]
"category" => [
"slug" => "the_slug"
]
]
我知道我可以通过explode 获取一个数组,但我不确定如何从这个开始得到最终结果。
EDIT 数组最初看起来像这样,因为它是从请求参数中提取的:http://url.com?test1.test2.test3=result&category.slug=the_slug 并且 Laravel 会自动将其转换为数组。
【问题讨论】:
标签:
php
arrays
multidimensional-array
【解决方案1】:
一个简单的解决方案:
$result = [];
foreach ($array as $key => $value) {
foreach (array_reverse(explode('_', $key)) as $key_part) {
$value = [$key_part => $value];
}
$result += $value;
}
如果您需要处理具有相同部分的多个键(例如test1_test2_test3 和test1_test2_test4),请将最后一行替换为:
$result = array_merge_recursive($result, $value);
【解决方案2】:
我的方法是反转数组,然后遍历键并嵌套它们。
下面的代码应该可以解决问题。
$array = [
"test1_test2_test3" => "result",
"category_slug" => "the_slug"
];
$array = array_map(function ($key, $value) {
$keys = array_reverse(explode('_', $key));
while($key = array_shift($keys)) {
$value = [$key => $value];
}
return $value;
}, array_keys($array), $array);
$array = call_user_func_array('array_merge', $array);
var_dump($array);
/**
array(2) {
["test1"]=>
array(1) {
["test2"]=>
array(1) {
["test3"]=>
string(6) "result"
}
}
["category"]=>
array(1) {
["slug"]=>
string(8) "the_slug"
}
}
*/
【解决方案3】:
一种方法:
$arr = array("test1_test2_test3" => "result", "category_slug" => "the_slug");
$res = array();
foreach($arr as $k=>$v) {
$t = explode("_", $k);
$new_arr = array();
$tmp = $v;
for($i=count($t)-1; $i > 0; $i--) {
$new_arr[$t[$i]] = $tmp;
$tmp = $new_arr;
$new_arr = array();
}
$res[$t[0]] = $tmp;
}
print_r($res);
结果:
Array
(
[test1] => Array
(
[test2] => Array
(
[test3] => result
)
)
[category] => Array
(
[slug] => the_slug
)
)
【解决方案4】:
查看 Laravel 文档,我找到了一个助手 array_set,这意味着为了将键更改为多维数组,我可以将键更改为使用点符号 str_replace,然后使用助手将其转换为:
$array = [
"test1_test2_test3" => "result"
"category_slug" => "the_slug"
]
$new_array = []
foreach($array as $key => $value)
{
$key = str_replace('_', '.', $key);
array_set($new_array, $key, $value);
}
结果:
array:2 [
"test1" => [
"test2" => [
"test3" => "result"
]
]
"category" => [
"slug" => "the_slug"
]
]