我有一个带有动态字段名称的表单
例如
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form method="POST" action="result.php?r=1542967950">
<input type="text" name="name[]" value="name 1">
<input type="text" name="user[first][name][]" value="user first name 1">
<input type="text" name="user[last][name][]" value="user last name 1">
<input type="text" name="name[]" value="name 2">
<input type="text" name="user[first][name][]" value="user first name 2">
<input type="text" name="user[last][name][]" value="user last name 2">
<button type="submit">go</button>
</form>
</body>
</html>
字段名称是通过设置生成的,如果我转储帖子内容,它将是:
array(2) {
["name"]=>
array(2) {
[0]=>
string(6) "name 1"
[1]=>
string(6) "name 2"
}
["user"]=>
array(2) {
["first"]=>
array(1) {
["name"]=>
array(2) {
[0]=>
string(17) "user first name 1"
[1]=>
string(17) "user first name 2"
}
}
["last"]=>
array(1) {
["name"]=>
array(2) {
[0]=>
string(16) "user last name 1"
[1]=>
string(16) "user last name 2"
}
}
}
}
我的目标是创建一个新数组,其结构如下:
$datas[0]['name'] = 'name 1';
$datas[0]['user']['first']['name'] = 'first name 1';
$datas[0]['user']['last']['name'] = 'first name 1';
$datas[1]['name'] = 'name 2';
$datas[1]['user']['first']['name'] = 'first name 2';
$datas[1]['user']['last']['name'] = 'first name 2';
array(2) {
[0]=>
array(2) {
["name"]=>
string(6) "name 1"
["user"]=>
array(2) {
["first"]=>
array(1) {
["name"]=>
string(12) "first name 1"
}
["last"]=>
array(1) {
["name"]=>
string(12) "first name 1"
}
}
}
[1]=>
array(2) {
["name"]=>
string(6) "name 2"
["user"]=>
array(2) {
["first"]=>
array(1) {
["name"]=>
string(12) "first name 2"
}
["last"]=>
array(1) {
["name"]=>
string(12) "first name 2"
}
}
}
}
PHP将使用字段名称中的[]符号来解析该字段,为避免错误的结果,我认为是像<input type="text" name="user-first-name[]" value="user first name 1">
这样的表单名称,但我无法弄清楚最后一个过程
使user-first-name
到$data[$i]['user']['first']['name']
,
答案 0 :(得分:1)
您需要使用explode()
将字符串转换为数组,并使用array_reverse()
将其反转,然后使用array_reduce()
创建目标结构数组。
$str = "user-first-name";
$arr = array_reverse(explode('-', $str));
$newArr = [array_reduce($arr, function($carry, $item){
return !count($carry) ? [$item => 'value'] : [$item => $carry];
})];
结果
Array
(
[0] => Array
(
[user] => Array
(
[first] => Array
(
[name] => value
)
)
)
)
在demo中查看实时结果