带有新密钥的数组中的php组元素

时间:2017-11-13 12:11:22

标签: php arrays hashmap

我有一个像这样的数组:

A = [
     {Categoria: 'example', Servico: 'name1'},
     {Categoria: 'example', Servico: 'name2'},
     {Categoria: 'example', Servico: 'name3'},
     {Categoria: 'example2', Servico: 'name4'},
     {Categoria: 'example2', Servico: 'name5'},
     {Categoria: 'example2', Servico: 'name6'},
     {Categoria: 'example3', Servico: 'name7'},
     {Categoria: 'example3', Servico: 'name8'},
     {Categoria: 'example3', Servico: 'name9'},
];

我必须在以下内容上进行转换:

B = [
     {Servico: 'example', children: [
          {Servico: 'name1'},
          {Servico: 'name2'},
          {Servico: 'name3'}
     ]},
     {Servico: 'example2', children: [
          {Servico: 'name4'},
          {Servico: 'name5'},
          {Servico: 'name6'}
     ]},
     {Servico: 'example3', children: [
          {Servico: 'name7'},
          {Servico: 'name8'},
          {Servico: 'name9'}
     ]}
]

我已阅读this topic并且我已成功对数组进行分组,但我无法找到一种方法来格式化数组,方法是在每个对象上Servicochildren

有人有什么想法吗?

3 个答案:

答案 0 :(得分:1)

通常我会在开发人员使用多个循环时尖叫,但对于这种情况,我认为它提供了一个更清洁/无条件的过程。我使用一个临时数组,由第一个循环构建,以生成所有深度索引数组。然后我使用第二个循环在您要求的结构中写入Categoria值。

代码:(Demo

$a=[
     ['Categoria'=>'example','Servico'=>'name1'],
     ['Categoria'=>'example','Servico'=>'name2'],
     ['Categoria'=>'example','Servico'=>'name3'],
     ['Categoria'=>'example2','Servico'=>'name4'],
     ['Categoria'=>'example2','Servico'=>'name5'],
     ['Categoria'=>'example2','Servico'=>'name6'],
     ['Categoria'=>'example3','Servico'=>'name7'],
     ['Categoria'=>'example3','Servico'=>'name8'],
     ['Categoria'=>'example3','Servico'=>'name9']
];

foreach($a as $row){
    $tmp[$row['Categoria']]['children'][]=['Servico'=>$row['Servico']];
}
foreach($tmp as $key=>$row){
    $b[]=['Servico'=>$key]+$row;
}
var_export($b);

输出:

array (
  0 => 
  array (
    'Servico' => 'example',
    'children' => 
    array (
      0 => 
      array (
        'Servico' => 'name1',
      ),
      1 => 
      array (
        'Servico' => 'name2',
      ),
      2 => 
      array (
        'Servico' => 'name3',
      ),
    ),
  ),
  1 => 
  array (
    'Servico' => 'example2',
    'children' => 
    array (
      0 => 
      array (
        'Servico' => 'name4',
      ),
      1 => 
      array (
        'Servico' => 'name5',
      ),
      2 => 
      array (
        'Servico' => 'name6',
      ),
    ),
  ),
  2 => 
  array (
    'Servico' => 'example3',
    'children' => 
    array (
      0 => 
      array (
        'Servico' => 'name7',
      ),
      1 => 
      array (
        'Servico' => 'name8',
      ),
      2 => 
      array (
        'Servico' => 'name9',
      ),
    ),
  ),
)

答案 1 :(得分:0)

您可以预先处理数组并使用所需的结构构建新数组。

$new =array();
Foreach($A as $item){
    If(!isset($new[$item['Categoria']])) $new[$item['Categoria']] = array(); // create array of not set
    $new[$item['Categoria']][] = $item['Servico']; // add servico item to array
}

如果没有找到它将创建它的子数组,则循环每个项目 然后添加'名称'子阵列中的值。

  

编辑,现在看看您希望将输出数组命名为B,只需更改“' new'到' B'在代码中。

答案 2 :(得分:0)

假设$ array是你的数组

$i=0;
$temp = array();
foreach ($array as $arr)
{
    if($i !=0 && $arr['Categoria'] == $temp[$i-1]['Servico']){
        $temp[$i-1]['children']['Servico'] = $arr['Servico'];
    }else{
        $temp[$i]['Servico'] =$arr['Categoria'];
        $temp[$i]['children']['Servico'] = $arr['Servico'];
        $i++;
    }
}
//$temp is your new array