2010-04-23 87 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