将数据分组到关联多维数组中并删除子数组中的重复项

问题描述 投票:0回答:1

我有一个像这样的数组:

$array = [
    [
        2 => 'kategorie_01',
        'tags' => [
            1 => 'tag_01',
            2 => 'tag_02',
        ],
    ],
    [
        3 => 'kategorie_02',
        'tags' => [
            2 => 'tag_02',
        ],
    ],
    [
        1 => 'Default',
        'tags' => [
            1 => 'tag_01',
            2 => 'tag_02',
        ],
    ],
    [
        2 => 'kategorie_01',
        'tags' => [
            2 => 'tag_02',
            3 => 'tag_03',
        ],
    ],
];

我想将上面的数组更改为以下数组。应消除所有重复的类别。第一个类别 (2 => kategorie_01) 接收已删除类别 (2 => kategorie_01) 的所有标签。此类别中的重复标签也应删除。

[
    [
        2 => 'kategorie_01',
        'tags' => [
            1 => 'tag_01',
            2 => 'tag_02',
            3 => 'tag_03',
        ],
    ],
    [
        3 => 'kategorie_02',
        'tags' => [
            2 => 'tag_02',
        ],
    ],
    [
        1 => 'Default',
        'tags' => [
            1 => 'tag_01',
            2 => 'tag_02',
        ],
    ],
];
php multidimensional-array grouping unique array-merge
1个回答
0
投票

假设类别值始终位于标签值之前,并且每个标签的键可用于确定标签值的唯一性,您可以在第一次遇到类别时将引用推送到结果数组中,然后在后续遇到时附加唯一数据。

代码:(演示

$result = [];
foreach ($array as $set) {
    foreach ($set as $k => $v) {
        if ($k !== 'tags') {
            $cat = $v;
            if (!isset($ref[$v])) {
                $ref[$v] = $set;
                $result[] = &$ref[$v];
            }
        } else {
            $ref[$cat]['tags'] += $v;
        }
    }
}
var_export($result);

输出:

array (
  0 => 
  array (
    2 => 'kategorie_01',
    'tags' => 
    array (
      1 => 'tag_01',
      2 => 'tag_02',
      3 => 'tag_03',
    ),
  ),
  1 => 
  array (
    3 => 'kategorie_02',
    'tags' => 
    array (
      2 => 'tag_02',
    ),
  ),
  2 => 
  array (
    1 => 'Default',
    'tags' => 
    array (
      1 => 'tag_01',
      2 => 'tag_02',
    ),
  ),
)
© www.soinside.com 2019 - 2024. All rights reserved.