2014-01-26 42 views
0

我得到了以下的問題在某種程度上堅持: 我想實現的是基於鍵合併以下陣列:PHP不能得到正確的格式陣列

{"Entities":{"submenu_id":"Parents","submenu_label":"parents"}} 
{"Entities":{"submenu_id":"Insurers","submenu_label":"insurers"}} 
{"Users":{"submenu_id":"New roles","submenu_label":"newrole"}} 
{"Users":{"submenu_id":"User - roles","submenu_label":"user_roles"}} 
{"Users":{"submenu_id":"Roles - permissions","submenu_label":"roles_permissions"}} 
{"Accounting":{"submenu_id":"Input accounting data","submenu_label":"new_accounting"}} 

哪些需要輸出像這樣的:

[{"item_header":"Entities"}, 
{"list_items" : 
    [{"submenu_id":"Parents","submenu_label":"parents"}, 
    {"submenu_id":"Insurers","submenu_label":"insurers"}] 
}] 
[{"item_header":"Users"}, 
{"list_items" : 
    [{"submenu_id":"New roles","submenu_label":"newrole"} 
    {"submenu_id":"User - roles","submenu_label":"user_roles"} 
    {"submenu_id":"Roles - permissions","submenu_label":"roles_permissions"}] 
}] 
[{"item_header":"Accounting"}, 
{"list_items" : 
    [{"submenu_id":"Input accounting data","submenu_label":"new_accounting"}] 
}] 

我一直在嘗試各種事情過去兩個小時,但每次嘗試返回不同的格式要求之一,因此慘敗。不知何故,我無法弄清楚。
您是否有構思才能完成這項工作?
我會很樂意聽到你在這個問題上的做法。

謝謝。

+0

如何使用存儲的HashMap的風格?針對每個密鑰存儲區存儲值的數組。如果您需要代碼,請回複評論。 –

+0

@AkshatSinghal一段代碼,以幫助我的方式將不勝感激。我嘗試了很多循環和臨時鍵值存儲組合,但其中沒有一個導致需要的格式。 – Trace

+0

檢查發佈的解決方案;如果您需要迭代新數組的代碼,請回復註釋。 –

回答

0

你在這裏!
在這種情況下,首先我將所有數組添加到一個數組中進行處理。
我以爲他們是在同一個陣列中,但現在我意識到他們不是。 只是要一個空$array=[]然後再加入他們都在$array[]=$a1$array[]=$a2,等...

$array = '[{"Entities":{"submenu_id":"Parents","submenu_label":"parents"}}, 
    {"Entities":{"submenu_id":"Insurers","submenu_label":"insurers"}}, 
    {"Users":{"submenu_id":"New roles","submenu_label":"newrole"}}, 
    {"Users":{"submenu_id":"User - roles","submenu_label":"user_roles"}}, 
    {"Users":{"submenu_id":"Roles - permissions","submenu_label":"roles_permissions"}}, 
    {"Accounting":{"submenu_id":"Input accounting data","submenu_label":"new_accounting"}}]'; 

    $array = json_decode($array, true); 


    $intermediate = []; // 1st step 

    foreach($array as $a) 
    { 
     $keys = array_keys($a); 
     $key = $keys[0]; // say, "Entities" or "Users" 
     $intermediate[$key] []= $a[$key]; 
    } 

    $result = []; // 2nd step 

    foreach($intermediate as $key=>$a) 
    { 
     $entry = ["item_header" => $key, "list_items" => [] ]; 
     foreach($a as $item) $entry["list_items"] []= $item; 
     $result []= $entry; 
    } 

    print_r($result); 
+0

謝謝你的工作! – Trace

0

我更喜歡面向對象的方法。

首先爲LIST_ITEM的對象:用於item_header

{"submenu_id":"Parents","submenu_label":"parents"}

其次一個目的:

{"item_header":"Entities", "list_items" : <array of list_item> }

最後所有的對象或數組:

{ "Menus: <array of item_header> }

以及相應的吸氣器/設定器等。

+0

感謝您的提示。我會在一段時間內給出一些更多的思考和嘗試錯誤。 – Trace

0

以下代碼將爲您提供必要的數組,您可以通過該數組進行迭代以獲得所需的輸出。

$final_array = array(); 
foreach($array as $value) { //assuming that the original arrays are stored inside another array. You can replace the iterator over the array to an iterator over input from file  
    $key = /*Extract the key from the string ($value)*/ 
    $existing_array_for_key = $final_array[$key]; 
    if(!array_key_exists ($key , $final_array)) { 
     $existing_array_for_key = array(); 
    } 
    $existing_array_for_key[count($existing_array_for_key)+1] = /*Extract value from the String ($value)*/ 
    $final_array[$key] = $existing_array_for_key; 
} 
1
$input = array(
    '{"Entities":{"submenu_id":"Parents","submenu_label":"parents"}}', 
    '{"Entities":{"submenu_id":"Insurers","submenu_label":"insurers"}}', 
    '{"Users":{"submenu_id":"New roles","submenu_label":"newrole"}}', 
    '{"Users":{"submenu_id":"User - roles","submenu_label":"user_roles"}}', 
    '{"Users":{"submenu_id":"Roles - permissions","submenu_label":"roles_permissions"}}', 
    '{"Accounting":{"submenu_id":"Input accounting data","submenu_label":"new_accounting"}}', 
); 

$input = array_map(function ($e) { return json_decode($e, true); }, $input); 

$result = array(); 
$indexMap = array(); 
foreach ($input as $index => $values) { 
    foreach ($values as $k => $value) { 
     $index = isset($indexMap[$k]) ? $indexMap[$k] : $index; 
     if (!isset($result[$index]['item_header'])) { 
      $result[$index]['item_header'] = $k; 
      $indexMap[$k] = $index; 
     } 
     $result[$index]['list_items'][] = $value; 
    } 
} 
echo json_encode($result); 
+0

+1感謝您的幫助! – Trace