假设我有一个包含这些字段的表单,并且无法重命名它们:
<input type="text" name="foo[bar]" />
<input type="text" name="foo[baz]" />
<input type="text" name="foo[bat][faz]" />
提交时,PHP将其转换为数组:
Array
(
[foo] => Array
(
[bar] => foo bar
[baz] => foo baz
[bat] => Array
(
[faz] => foo bat faz
)
)
)
有哪些方法可以将此数组转换或展平为数据结构,例如:
Array
(
[foo[bar]] => foo bar
[foo[baz]] => foo baz
[foo[bat][faz]] => foo bat faz
)
答案 0 :(得分:4)
我认为这就是你想要的
$ritit = new RecursiveIteratorIterator(new RecursiveArrayIterator($arr));
$result = array();
foreach ($ritit as $leafValue) {
$path = 'foo99';
foreach (range(0, $ritit->getDepth()) as $depth) {
$path .= sprintf('[%s]', $ritit->getSubIterator($depth)->key());
}
$result[$path] = $leafValue;
}
默认情况下,RecursiveIteratorIterator只访问叶节点,因此外部foreach循环的每次迭代都会在您关注的其中一个值上停止迭代器结构。我们通过查看RecursiveIteratorIterator为我们创建和管理的迭代器(每个级别使用一个迭代器)找到构建我们所在位置的路径的键。
答案 1 :(得分:0)
可能是愚蠢的答案,但为什么不这样做
<input type="text" name="foobar" />
<input type="text" name="foobaz" />
<input type="text" name="foobatfaz" />
答案 2 :(得分:-2)
不是你的问题的答案,但也有extract,它将采用一个数组并从中产生变量。例如;
$array = array
(
[foo] => foo bar
[boo] => something else
)
extract($array);
输出
$foo = 'foo bar';
$boo = 'something else';
有一些关于如何处理相同索引名称的选项,例如,写入现有值或在变量名称后附加前缀。