2010-04-23 72 views
2

说我有这些字段的表格,并且不能将其重命名:拼合PHP数组

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

来吧,这不是很难搜索!这里有一些bing结果:http://www.bing.com/search?q=php%2Barray%2Bflatten 这里是一个从堆栈溢出: http://stackoverflow.com/questions/1319903/how-to- flatten-a-multidimensional-array – encee 2010-04-23 22:41:34

+1

一个典型的数组flatten并不是要求的。每个叶节点的每条路径中的所有密钥都是问题,然后从每个路径中的密钥中构建一个字符串。 – goat 2010-04-24 03:18:04

回答

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为我们创建和管理的迭代器(每个级别使用一个迭代器),我们找到构建我们路径的关键字。

+0

真棒,谢谢克里斯!我应该更多地了解SPL – deadkarma 2010-04-24 07:04:51

0

可能是愚蠢的答案,但为什么不让它

<input type="text" name="foobar" /> 
<input type="text" name="foobaz" /> 
<input type="text" name="foobatfaz" /> 

+1

问题的第一句话:“说我有这些字段的表单,并且不能重命名它们......” – 2010-04-23 23:41:22

-2

不是你的问题的答案,但也有extract这将采取一个数组,并从他们产生的变量。例如;

$array = array 
    (
     [foo] => foo bar 
     [boo] => something else 
    ) 
extract($array); 

输出

$foo = 'foo bar'; 
$boo = 'something else'; 

有关于如何处理相同的目录名称,例如,在写现有的值或前缀追加到变量名中的几个选项。

+4

使用'extract'与用户输入总是坏主意 – 2010-04-23 22:44:50

+0

非常有效的一点。没有考虑过这个。 – bigstylee 2010-04-23 23:06:31