2013-07-19 85 views
4

我正在查詢一個API,它發送一個JSON響應,然後我將其解碼爲一個數組。這部分工作正常,但API以非常不友好的格式發送信息。PHP,將括號中的字符串轉換爲數組

我會粘貼我遇到的問題。基本上,我試圖將每個像鍵一樣改成他們自己的數組。

Array 
(
    [name] => Name 
    [address] => 123 Street Rd 
    [products[0][product_id]] => 1 
    [products[0][price]] => 12.00 
    [products[0][name]] => Product Name 
    [products[0][product_qty]] => 1 
    [products[1][product_id]] => 2 
    [products[1][price]] => 3.00 
    [products[1][name]] => Product Name 
    [products[1][product_qty]] => 1 
    [systemNotes[0]] => Note 1 
    [systemNotes[1]] => Note 2 
) 

現在我想的事就是讓 這樣的:

Array 
(
    [name] => Name 
    [address] => 123 Street Rd 
    [product] => Array 
    (
     [0] => Array 
     (
      [product_id] => 1 
      [price] => 12.00 
      [name] => Product Name 
      [product_qty] => 1 
     ) 
     [1] => Array 
     (
      [product_id] => 2 
      [price] => 3.00 
      [name] => Product Name 
      [product_qty] => 1 
     ) 
    [systemNotes] => Array 
    (
     [0] => Note 1 
     [1] => Note 2 
    ) 
) 

是否有這樣做的任何實際的方法?

謝謝!

+3

我的哀悼。 –

+0

第一個例子實際上是print_r的輸出嗎?即使解碼JSON,我也從來沒有見過這樣的結構。如果是這樣,請添加一個解析該結構的JSON樣本,以便我可以正確地將我的大腦包裹在它周圍。 –

回答

5

引用是你的朋友在這裏:

$result = array(); 

foreach ($inputArray as $key => $val) { 
    $keyParts = preg_split('/[\[\]]+/', $key, -1, PREG_SPLIT_NO_EMPTY); 

    $ref = &$result; 

    while ($keyParts) { 
     $part = array_shift($keyParts); 

     if (!isset($ref[$part])) { 
      $ref[$part] = array(); 
     } 

     $ref = &$ref[$part]; 
    } 

    $ref = $val; 
} 

Demo


然而,還有另外一個,簡單的方法,雖然有點少高效的功能複雜性:

parse_str(http_build_query($inputArray), $result); 

Demo

+0

+1 - 很好!但是,這是一個難得的機會來哄騙所有的正則表達式「專家」,並將正則表達式寫爲'/ [] [] + /'! (相信我,它的工作原理。) –

+0

@ acheong87如果你喜歡第一個版本,請嘗試第二個;-) – DaveRandom

+0

我正要說,你的編輯讓我大跌眼鏡。希望在其他地方獲得補償。 –

0

隨着$array源陣列:

$new_array = array("name" => $array["name"], "address" => $array["address"]); 
foreach($array["products"] AS $product) 
{ 
    $new_array["product"][] = array(
     "product_id" => $product["produit_id"], 
     "price" => $product["price"], 
     "name" => $product["name"], 
     "product_qty" => $product["product_qty"]); 
} 

foreach($array["systemNotes"] AS $note) 
{ 
    $new_array["systemNotes"][] = $note; 
} 

它僅僅是瀏覽和創建新的結構。 ^^

編輯:某些通用可以遞歸地完成。只要瀏覽元素is_array調用相同的函數,並根據鍵和值構建一個新的數組。看起來像一個文件系統^^

+0

我認爲他正在尋找一個通用的解決方案。 –

+0

不幸的是,基本數組完全不像「通用」......否則我們沒有足夠的有關該問題的信息。 –

+0

我想,我不同意。我會說一個通用的解決方案會是這樣的:「如果密鑰有平衡的方括號,然後解析。」解析會將密鑰「爆炸」到一個新的子數組中,使得密鑰可以成功訪問其值,而密鑰本身作爲變量插入。 –