如何在Laravel中获取两个多维集合的共同元素?
解决Laravel多维集合求交集的问题
嘿,这个场景我太熟悉了!默认的intersect()方法确实只适用于一维的集合/数组,碰到这种包含对象的多维集合,就得用自定义的匹配逻辑来筛选共同元素。
针对你给出的两个集合,我们可以通过filter()结合contains()方法来实现需求,而且能完美保留第一个集合的元素结构(比如保留class字段而不是第二个集合的class_name)。
具体代码实现
假设你的第一个集合是$collectionA,第二个是$collectionB,代码如下:
$result = $collectionA->filter(function ($itemA) use ($collectionB) { // 检查第二个集合中是否存在id相同、且class/class_name匹配的元素 return $collectionB->contains(function ($itemB) use ($itemA) { // 这里用id作为核心唯一标识,同时匹配class字段(按需调整) return $itemA->id === $itemB->id && $itemA->class === $itemB->class_name; }); });
代码解释
filter()会遍历$collectionA的每一个元素,只保留满足条件的元素;- 内层的
contains()负责在$collectionB中查找是否存在和当前$itemA匹配的元素; - 匹配规则我们用了
id(因为id通常是数据的唯一标识)+class/class_name的组合,如果你只需要根据id判断,直接去掉class的匹配条件即可。
这样处理后,$result就是你期望的集合——只保留两个集合的共同元素,并且结构和$collectionA一致。
如果你使用的是Laravel 8及以上版本,还可以用更简洁的intersectUsing()方法:
$result = $collectionA->intersectUsing($collectionB, function ($itemA, $itemB) { return $itemA->id === $itemB->id && $itemA->class === $itemB->class_name; });
这个方法本质和上面的逻辑一致,只是写法更紧凑,你可以根据自己的Laravel版本选择合适的方式。
内容的提问来源于stack exchange,提问作者baig772
相关产品推荐
相关产品推荐

