PHP可以';无法获取数组的正确格式

PHP可以';无法获取数组的正确格式,php,arrays,loops,Php,Arrays,Loops,我不知怎的遇到了以下问题: 我想要实现的是基于密钥合并以下数组: {"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":"

我不知怎的遇到了以下问题: 我想要实现的是基于密钥合并以下数组:

{"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"}]
}]
在过去的两个小时里,我一直在尝试各种各样的事情,但每次尝试都返回了一种不同的格式,结果惨败。不知怎的,我搞不懂。
为了完成这项工作,你有什么想法吗?
我很想听听你对此事的看法


谢谢

我更喜欢面向对象的方法

首先是列表项的对象:

{“子菜单id”:“父菜单”,“子菜单标签”:“父菜单”}

第二个对象用于项_标题:

{“项目标题”:“实体”,“列表项目”:}

最后一个对象或所有对象的数组:

{“菜单:}


以及相应的getter/setter等。

下面的代码将为您提供必要的数组,您可以通过该数组进行迭代以获得所需的输出

$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;
}
给你!
在本例中,首先我将所有数组添加到一个数组中进行处理。
起初我以为它们在同一阵列中,但现在我意识到它们不是。 只需创建一个空的
$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);

如何使用HashMap风格的存储?对每个键存储一个存储值的数组。如果您需要代码,请回复。@AkshatSinghal一段代码来帮助我将不胜感激。我尝试了许多循环和临时键值存储组合,但没有一个达到所需的格式。请检查solution已发布;如果您需要迭代新数组的代码,请回复。感谢您的提示。我将对此进行更多思考,并在一段时间内尝试错误。
$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);