2015-04-22 64 views
3

我試圖將數組的鍵值轉換爲多維數組。關鍵值看起來是多維的,但僅僅是文本。我已經嘗試過炸開字符串並創建一個新的數組,但我覺得必須有比這更簡單的事情。如何將拼合數組轉換爲PHP中的多維數組

下例:

Array (
[Template[URL]] => http://www.asdasdda.com 
[Template[UPC]] => 5484548546314 
[Field[value]] => Test Example 
[Field[answer]] => 20) 

所有幫助是非常appricated。 :)

更新: 這是在我對數據運行json_decode之前數據的確切輸出。

{"Template[URL]":"http://www.asdasdda.com","Template[UPC]":"5484548546314","Field[value]":"Test Example","Field[answer]":"20"} 
+0

無法修復它正在創建數組的位置? – Devon

+0

如果你的代表* Template [URL] *保存了一個字符串值,這肯定會算出來。這是什麼*模板[URL] *?它不是一個變量..如果* Template *是一個數組,然後參考它適當的 - 如:* $ Template ['URL'] * – animaacija

+0

@Devon這是來自我公司的另一個部門的API,誰建立這是非常難以合作,所以我寧願嘗試和轉換它。有趣的是他通過json發送它,但沒有對多維數組進行編碼,只是將其扁平化。 –

回答

4

擺弄了一下,我想我明白了。我不認爲有什麼簡單的方法:

foreach ($array as $key=>$value) { 
    preg_match("/\[(.+)\]/",$key,$match); 
    $newKey = preg_replace("/\[.+\]/","",$key); 
    $newArray[$newKey][$match[1]] = $value; 
} 

$newArray一個print_r()如下:

Array ( 
    [Template] => Array ( 
     [URL] => http://www.asdasdda.com 
     [UPC] => 5484548546314 
     ) 
    [Field] => Array ( 
     [value] => Test Example 
     [answer] => 20 
     ) 
    ) 
+1

謝謝,這個作品很棒。 :) –

+0

很高興它適合你! –

+0

如果你只有單一的級別,例如Template [URL],那麼這將工作得很好。如果你有多個級別,例如Template [1] [URL],那麼你可以參考我的答案在循環中使用引用。 – Devon

2

正在創建的數組,其中的問題也許應該得到解決。如果您沒有訪問到,那麼你可以使用正則表達式與參考循環到數組轉換:

$array = [ 
"Template[URL]" => 'http://www.asdasdda.com', 
"Template[UPC]" => '5484548546314', 
"Multi[Level][Array]" => 'Hello World' 
]; 

function convert(&$array, $key, $value) { 
    preg_match_all("/(?=^)[^]]+(?=\[)|(?<=\[)[^]]+(?=\])/", $key, $keys); 
    if ($keys = $keys[0]) { 
     // Unset original key 
     unset($array[$key]); 
     // Dig into each level of keys and reassign the reference 
     foreach($keys as $key) { 
      if (!isset($array[$key])) $array[$key] = null; 
      $array = &$array[$key]; 
     } 
     // Set the final level equal to the original value 
     $array = $value; 
    } 
} 

foreach($array as $key=>$value) { 
    convert($array, $key, $value); 
} 

print_r($array); 

輸出:

Array 
(
    [Template] => Array 
     (
      [URL] => http://www.asdasdda.com 
      [UPC] => 5484548546314 
     ) 

    [Multi] => Array 
     (
      [Level] => Array 
       (
        [Array] => Hello World 
       ) 

     ) 

) 

參考使用,所以你可以挖成多水平,如果你需要。

相關問題