这是我目前查找多个 Laravel 集合的交集的方法:
$stuff = [
collect(['a','b','c','d']),
collect(['b','c','d','e']),
collect(['c','d','e','f']),
];
$i = 0;
foreach ($stuff as $current) {
$i++;
if ($i === 1) {
$common = $current;
} else {
$common = $common->intersect($current);
}
}
dd($common);
有没有更有效的方法?必须以不同的方式对待第一个集合(通过
if...else...
)似乎有点笨拙。
Laravel 有很多好的收集方法,我怀疑有更优雅的方法来解决这个问题。
减少可能是一个选项:
$intersection = collect([
collect(['a','b','c','d']),
collect(['b','c','d','e']),
collect(['c','d','e','f']),
])->reduce(function ($carry, $item) {
return $carry->empty() ? $item : $carry->intersect($item);
});
要查找两个以上集合的交集,请使用
reduce()
迭代集合并在结果和每个遇到的集合之间调用 intersect()
。为了确保填充结果变量,请将 first()
集合作为默认结果值传递 - 它将始终与其自身完全相交。
代码:(PHPize演示)
$collection = collect([
collect(['a','b','c','d']),
collect(['b','c','d','e']),
collect(['c','d','e','f'])
]);
var_export(
$collection->reduce(fn($result, $row) => $result->intersect($row), $collection->first())
);
输出:
\Illuminate\Support\Collection::__set_state(array(
'items' =>
array (
2 => 'c',
3 => 'd',
),
'escapeWhenCastingToString' => false,
))