Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
展平PHP数组_Php_Forms_Arrays - Fatal编程技术网

展平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;
}