首页 > 解决方案 > 比较 laravel 集合

问题描述

我有两个集合:“说明”和“已知”。基本上,我正在采用一组新的“说明”并检查是否有任何与“已知”不同的内容。

所以,数量并不大。我检索信息:

$Instructions = Instruction::all();
$Knowns = Known::all();

现在,我正在寻找差异,我已经尝试了这三种方法中的每一种:

$IssuesFound = $Instructions->diff($Knowns); 
$IssuesFound = $Instructions->diffKeys($Knowns); 
$IssuesFound = $Instructions->diffAssoc($Knowns); 

问题是,“指令”或“已知”是具有 17 个属性的项目,其中任何一个属性都可以不同。我想将“指令”的属性与“已知”的匹配属性进行比较。(两个项目有相同的键,机器人项目有一个Reference属性作为一个唯一的标识符。

我发现这些方法给了我不同的项目,但没有告诉我哪些个别属性是不匹配的。

foreach ($IssuesFound as $issue)
    {
        dd($issue);
    }

所以像这样的方法$IssuesFound = $Instructions->diffKeys($Knowns);会提出项目 xxx 不同,但我看不出如何找出项目的哪个属性不同。除非我开始嵌套循环并遍历所有属性——我试图避免这种情况。

我该怎么做?

提前致谢。(Laravel 5.6)

标签: laravelcomparelaravel-collection

解决方案


直接来自 laravel 文档,diffAssoc 将返回您的要求:

$collection = collect([
    'color' => 'orange',
    'type' => 'fruit',
    'remain' => 6
]);

$diff = $collection->diffAssoc([
    'color' => 'yellow',
    'type' => 'fruit',
    'remain' => 3,
    'used' => 6
]);

$diff->all();

// ['color' => 'orange', 'remain' => 6]

您从第一个集合中获得与第二个集合不同的属性,因此如果您在调用时获得 3 个属性,$diff->all()您将知道哪些属性是不同的,因此您可以访问它们或做任何您想做的事情,如果您发布更具体的结果关于你得到什么和你正在尝试什么,我们可以提供帮助,但我认为你只是没有考虑如何使用这些方法


推荐阅读