我有一个像这样的数组:
$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',
],
],
];
假设类别值始终位于标签值之前,并且每个标签的键可用于确定标签值的唯一性,您可以在第一次遇到类别时将引用推送到结果数组中,然后在后续遇到时附加唯一数据。
代码:(演示)
$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',
),
),
)