You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;
    });
});

代码解释

  1. filter()会遍历$collectionA的每一个元素,只保留满足条件的元素;
  2. 内层的contains()负责在$collectionB中查找是否存在和当前$itemA匹配的元素;
  3. 匹配规则我们用了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:18:44