Laravel Collections:寻找交集

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

这是我目前查找多个 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 有很多好的收集方法,我怀疑有更优雅的方法来解决这个问题。

laravel collections
2个回答
0
投票

减少可能是一个选项:

$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);
});

0
投票

要查找两个以上集合的交集,请使用

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,
))
© www.soinside.com 2019 - 2024. All rights reserved.