展平PHP数组
假设我有一个包含这些字段的表单,并且无法重命名它们:展平PHP数组,php,forms,arrays,Php,Forms,Arrays,假设我有一个包含这些字段的表单,并且无法重命名它们: <input type="text" name="foo[bar]" /> <input type="text" name="foo[baz]" /> <input type="text" name="foo[bat][faz]" /> 有哪些方法可以将此阵列转换或展平为数据结构,例如: Array ( [foo[bar]] => foo bar [foo[baz]] => f
<input type="text" name="foo[bar]" />
<input type="text" name="foo[baz]" />
<input type="text" name="foo[bat][faz]" />
有哪些方法可以将此阵列转换或展平为数据结构,例如:
Array
(
[foo[bar]] => foo bar
[foo[baz]] => foo baz
[foo[bat][faz]] => foo bat faz
)
也许答案很愚蠢,但为什么不去做呢
<input type="text" name="foobar" />
<input type="text" name="foobaz" />
<input type="text" name="foobatfaz" />
?不是你问题的答案,但也有一种方法,它将获取一个数组并从中生成变量。eg
$array = array
(
[foo] => foo bar
[boo] => something else
)
extract($array);
输出
$foo = 'foo bar';
$boo = 'something else';
关于如何处理相同的索引名,有几个选项,例如,重写现有值或在变量名后附加前缀。我想这就是您想要的
$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循环的每次迭代都会在您关心的某个值上停止迭代器结构。通过浏览递归迭代器为我们创建和管理的迭代器(每个级别使用一个迭代器),我们可以找到构建我们前进道路的关键点。来吧,搜索并不难!这里有一些bing的结果:这里有一个来自stack overflow的结果:典型的数组展平并不是我们想要的。每个叶节点的每个路径中的所有键都是问题所在,然后用每个路径中的键构建一个字符串。在用户输入中使用
extract
总是不好的想法问题的第一句话:“假设我有一个包含这些字段的表单,并且无法重命名它们…”太棒了,谢谢chris!我真的应该更多地了解SPL
$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;
}