элементы группы php из массива с новым ключом

У меня есть массив, как этот:

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'}
]}
]

я прочитал Эта тема и я успешно сгруппировал свой массив, но я не смог найти способ отформатировать массив так, как я Servico а также children на каждом объекте.

У кого-нибудь есть идеи?

1

Решение

Обычно я кричу, когда разработчики используют несколько циклов, но для этого случая я думаю, что это обеспечивает более чистый / безусловный процесс. Я использую временный массив, созданный первым циклом, для генерации всех глубоко проиндексированных массивов. Затем я использую второй цикл, чтобы написать Categoria значения в структуре, которую вы просили.

Код: (демонстрация)

$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

Другие решения

Вы можете использовать массив и создавать новый массив с нужной вам структурой.

$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
}

Это зацикливает каждый элемент, если он не находит подмассив, который он создаст.
Затем добавьте значения «name» в подмассив.

Отредактируйте, посмотрите, что вы хотите, чтобы ваш выходной массив получил имя B, просто измените «new» на «B» в коде.

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
0
По вопросам рекламы [email protected]