展平PHP数组

时间:2010-04-23 22:33:40

标签: php forms arrays

假设我有一个包含这些字段的表单,并且无法重命名它们:

<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
)

3 个答案:

答案 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';

有一些关于如何处理相同索引名称的选项,例如,写入现有值或在变量名称后附加前缀。