使用Laravel Collection获取重复值

Ant*_*les 5 php laravel laravel-5 laravel-5.2 laravel-5.3

我不想删除重复的值,我想获取articles_id重复项并将其数量值相加,例如,这是我的集合:

Collection {#306 ?
  #items: array:3 [?
    0 => CartLine {#294 ?
      +quantity: 2
      +article_id: 1728
      +article_name: "TAZA CERAMICA"
    }
    1 => CartLine {#296 ?
      +parent_line_id: null
      +quantity: 1
      +article_id: 1728
      +article_name: "TAZA CERAMICA"
    }
    2 => CartLine {#298 ?
      +quantity: 1
      +article_id: 1378
      +article_name: "JARRA CERVEZA ALEMANA"

    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我希望得到这个结果:

Collection {#306 ?
  #items: array:3 [?
    0 => CartLine {#294 ?
      +quantity: 3 //sum total quantity of the duplicates elements with same article_id
      +article_id: 1728
      +article_name: "TAZA CERAMICA"
    }
    1 => CartLine {#296 ?
      +parent_line_id: null
      +quantity: 3
      +article_id: 1728
      +article_name: "TAZA CERAMICA"
    }
    2 => CartLine {#298 ?
      +quantity: 1
      +article_id: 1378
      +article_name: "JARRA CERVEZA ALEMANA"

    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我想要对重复元素的数量求和,并在这些元素中使用和设置数量属性.

小智 14

另一种获取分组重复项的解决方案:

\n\n
    $collection = collect([\n        [\n            \'name\' => \'aa\',\n            \'value\' => 22\n        ],\n        [\n            \'name\' => \'bb\',\n            \'value\' => 22\n        ],\n        [\n            \'name\' => \'cc\',\n            \'value\' => 11\n        ],\n        [\n            \'name\' => \'bb\',\n            \'value\' => 33\n        ],\n        [\n            \'name\' => \'bb\',\n            \'value\' => 33\n        ],\n        [\n            \'name\' => \'bb\',\n            \'value\' => 33\n        ],\n    ]);\n\n    $groupedByValue = $collection->groupBy(\'value\');\n\n    $dupes = $groupedByValue->filter(function (Collection $groups) {\n        return $groups->count() > 1;\n    });\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出:

\n\n
array:2 [\xe2\x96\xbc\n  22 => array:2 [\xe2\x96\xbc\n    0 => array:2 [\xe2\x96\xbc\n      "name" => "aa"\n      "value" => 22\n    ]\n    1 => array:2 [\xe2\x96\xbc\n      "name" => "bb"\n      "value" => 22\n    ]\n  ]\n  33 => array:3 [\xe2\x96\xbc\n    0 => array:2 [\xe2\x96\xbc\n      "name" => "bb"\n      "value" => 33\n    ]\n    1 => array:2 [\xe2\x96\xbc\n      "name" => "bb"\n      "value" => 33\n    ]\n    2 => array:2 [\xe2\x96\xbc\n      "name" => "bb"\n      "value" => 33\n    ]\n  ]\n]\n
Run Code Online (Sandbox Code Playgroud)\n


小智 8

我知道这个答案已被接受,但我刚刚在搜索同样的东西时发现了这个StackOverflow帖子.我最终做的是以下内容.

$users = Users::all();
$usersUnique = $users->unique('id');
$usersDupes = $users->diff($usersUnique);

dd($users, $usersUnique, $usersDupes);
Run Code Online (Sandbox Code Playgroud)

我只需要一次性用途,所以如果你需要在生产页面上使用它,我不确定这是多么高效.

  • 这是不正确的。unique() 方法将提供所有唯一 ID,删除重复项,因此唯一集合与原始集合的差异将始终为空。 (3认同)

Rwd*_*Rwd 6

您可以尝试类似:

$collection->groupBy('article_id')->flatMap(function ($items) {

    $quantity = $items->sum('quantity');

    return $items->map(function ($item) use ($quantity) {

        $item->quantity = $quantity;

        return $item;

    });

});
Run Code Online (Sandbox Code Playgroud)

显然,将其更改$collection为保存集合的变量。

希望这可以帮助!