Php 使用包含组值的新元素对数组中的元素进行分组

Php 使用包含组值的新元素对数组中的元素进行分组,php,arrays,multidimensional-array,grouping,Php,Arrays,Multidimensional Array,Grouping,我有一个这样的数组: $array = [ ['Categoria' => 'example', 'Servico' => 'name1'], ['Categoria' => 'example', 'Servico' => 'name2'], ['Categoria' => 'example', 'Servico' => 'name3'], ['Categoria' => 'example2', 'Servico'

我有一个这样的数组:

$array = [
     ['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']
];
我需要将其转换为以下内容:

[
    [
        '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
子对象


有人有什么想法吗?

您可以使用该数组,并使用所需的结构构建一个新数组

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


假设$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

这里不需要多个循环、条件或计数器

每个组的
Servico
值(
$row['Categoria']
)可以在每次迭代中安全地覆盖

每个新的
$row['Servico']
值都将无条件地推送到相应的
子数组中

使用
$row['Categoria']
在结果数组中提供临时分组键后,使用
array\u values()重新索引结果。

*注意:我选择将
子对象的数据结构展平为索引数组。我认为为每个条目创建单元素关联数组没有任何价值。如果确实需要,则将
['Servico'=>$row['Servico']]
推入
子项中

带有
数组的函数样式\u reduce()
:()


经典的foreach()
:()


等待你怎么能在同一个数组中有几个同名的键?@Andreas,我有一个带有Servico的
faher
,它的所有
子项也必须有Servico作为键。我不认为这会是个问题。这是可行的,但它不会在每个对象上显示键的名称,例如
Servico
children
。我怎么能这样做呢?这个方法不会读取整个数组。它返回给我的每个元素只有一个子元素。这一个是完美的!但是我在玩你的代码,我做了一些类似的事情,唯一的问题是每个数组的索引是
Servico
的名称,而不是一个数字,就像你的例子一样。你知道我能做些什么来达到你的结果吗?不知道。不幸的是,你不能在一个foreach循环中在两个级别上使用php的自动数组索引。我确信这个过程可以在一个循环中完成,但是您将失去自动索引功能(您将不得不使用计数器并有条件地增加它们——创建的卷积代码)。我建议在这种情况下使用两个循环,这就是我的想法。我将使用两个循环。非常感谢你的回答。问题解决了!
var_export(
    array_values(
        array_reduce(
            $array,
            function ($carry, $row) {
                $carry[$row['Categoria']]['Servico'] = $row['Categoria'];
                $carry[$row['Categoria']]['children'][] = $row['Servico'];
                return $carry;
            }
        )
    )
);
$result = [];
foreach ($array as $row) {
    $result[$row['Categoria']]['Servico'] = $row['Categoria'];
    $result[$row['Categoria']]['children'][] = $row['Servico'];
}
var_export(array_values($result));