我有一个包含重复结果的集合,但相关字段中有不同的数据。我想消除重复项,但通过组合该字段的值来保留其他数据。我似乎找不到一个好的方法来做到这一点。我的结果集如下所示:
"bankers" => Collection {#663 ▼
#items: array:5 [▼
0 => Collection {#465 ▼
#items: array:5 [▼
"banker_id" => 13
"banker_name" => "John Banker"
"type" => "lending"
"deal_score" => 1
]
}
1 => Collection {#455 ▼
#items: array:5 [▼
"banker_id" => 62667
"banker_name" => "Harvey Aandreau"
"type" => "lending"
"deal_score" => 0
]
}
2 => Collection {#419 ▼
#items: array:6 [▼
"banker_id" => 13
"banker_name" => "John Banker"
"type" => "quotes"
"deal_score" => 1
]
}
3 => Collection {#410 ▼
#items: array:6 [▼
"banker_id" => 297
"banker_name" => "Melissa Jablonsky"
"type" => "quotes"
"deal_score" => 1
]
}
]
}
我想删除第二个重复的“John Banker”,但将“type”字段的值添加到前一条记录中,例如:
"bankers" => Collection {#663 ▼
#items: array:5 [▼
0 => Collection {#465 ▼
#items: array:5 [▼
"banker_id" => 13
"banker_name" => "John Banker"
"type" => "lending, quotes"
"deal_score" => 1
]
}
1 => Collection {#455 ▼
#items: array:5 [▼
"banker_id" => 62667
"banker_name" => "Harvey Aandreau"
"type" => "lending"
"deal_score" => 0
]
}
3 => Collection {#410 ▼
#items: array:6 [▼
"banker_id" => 297
"banker_name" => "Melissa Jablonsky"
"type" => "quotes"
"deal_score" => 1
]
}
]
}
我需要保留当前的订单。如果需要,“type”字段可以更改为数组。任何建议将不胜感激。
感谢Joseph Silber提供以下建议:
$bankers->groupBy('banker_name')->map(function ($bankers) {
return array_merge($banker[0]->all(), [
'type' => $bankers->pluck('type')->implode(',');
]);
});
put()
链接到每个组的
first()
成员,以使用
type
和
pluck()
生成的逗号分隔值覆盖其
implode()
属性。使用
values()
重新索引数组(如果您不希望
banker_name
值作为第一级键。代码:(
PHPize演示)
var_export(
$bankers
->groupBy('banker_name')
->map(fn($group) => $group->first()->put('type', $group->pluck('type')->implode(', ')))
->values()
->toArray()
);
输出:
array (
0 =>
array (
'banker_id' => 13,
'banker_name' => 'John Banker',
'type' => 'lending, quotes',
'deal_score' => 1,
),
1 =>
array (
'banker_id' => 62667,
'banker_name' => 'Harvey Aandreau',
'type' => 'lending',
'deal_score' => 0,
),
2 =>
array (
'banker_id' => 297,
'banker_name' => 'Melissa Jablonsky',
'type' => 'quotes',
'deal_score' => 1,
),
)