我有一个像这样的数组:
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并且我已成功对数组进行分组,但我无法找到一种方法来格式化数组,方法是在每个对象上Servico
和children
有人有什么想法吗?
答案 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