使用 Laravel Collection 获取重复值
Use Laravel Collection to get duplicate values
我不想删除重复值,我想获取 articles_id 个重复项并将它们的数量值相加,例如,这是我的 collection:
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"
}
]
}
我想得到这个结果:
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"
}
]
}
我想对重复元素的数量求和,并用这些元素的总和设置数量 属性。
您可以尝试类似的方法:
$collection->groupBy('article_id')->flatMap(function ($items) {
$quantity = $items->sum('quantity');
return $items->map(function ($item) use ($quantity) {
$item->quantity = $quantity;
return $item;
});
});
显然,将 $collection
更改为您所称的保存集合的变量。
希望对您有所帮助!
我知道这个答案已经被接受,但我在搜索相同内容时才发现这个 Whosebug post。我最终做的是以下内容。
$users = Users::all();
$usersUnique = $users->unique('id');
$usersDupes = $users->diff($usersUnique);
dd($users, $usersUnique, $usersDupes);
我只需要一次性使用我的,所以我不确定如果您需要在生产页面上使用它,它的性能如何。
获取分组重复项的另一种解决方案:
$collection = collect([
[
'name' => 'aa',
'value' => 22
],
[
'name' => 'bb',
'value' => 22
],
[
'name' => 'cc',
'value' => 11
],
[
'name' => 'bb',
'value' => 33
],
[
'name' => 'bb',
'value' => 33
],
[
'name' => 'bb',
'value' => 33
],
]);
$groupedByValue = $collection->groupBy('value');
$dupes = $groupedByValue->filter(function (Collection $groups) {
return $groups->count() > 1;
});
输出:
array:2 [▼
22 => array:2 [▼
0 => array:2 [▼
"name" => "aa"
"value" => 22
]
1 => array:2 [▼
"name" => "bb"
"value" => 22
]
]
33 => array:3 [▼
0 => array:2 [▼
"name" => "bb"
"value" => 33
]
1 => array:2 [▼
"name" => "bb"
"value" => 33
]
2 => array:2 [▼
"name" => "bb"
"value" => 33
]
]
]
我不想删除重复值,我想获取 articles_id 个重复项并将它们的数量值相加,例如,这是我的 collection:
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"
}
]
}
我想得到这个结果:
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"
}
]
}
我想对重复元素的数量求和,并用这些元素的总和设置数量 属性。
您可以尝试类似的方法:
$collection->groupBy('article_id')->flatMap(function ($items) {
$quantity = $items->sum('quantity');
return $items->map(function ($item) use ($quantity) {
$item->quantity = $quantity;
return $item;
});
});
显然,将 $collection
更改为您所称的保存集合的变量。
希望对您有所帮助!
我知道这个答案已经被接受,但我在搜索相同内容时才发现这个 Whosebug post。我最终做的是以下内容。
$users = Users::all();
$usersUnique = $users->unique('id');
$usersDupes = $users->diff($usersUnique);
dd($users, $usersUnique, $usersDupes);
我只需要一次性使用我的,所以我不确定如果您需要在生产页面上使用它,它的性能如何。
获取分组重复项的另一种解决方案:
$collection = collect([
[
'name' => 'aa',
'value' => 22
],
[
'name' => 'bb',
'value' => 22
],
[
'name' => 'cc',
'value' => 11
],
[
'name' => 'bb',
'value' => 33
],
[
'name' => 'bb',
'value' => 33
],
[
'name' => 'bb',
'value' => 33
],
]);
$groupedByValue = $collection->groupBy('value');
$dupes = $groupedByValue->filter(function (Collection $groups) {
return $groups->count() > 1;
});
输出:
array:2 [▼
22 => array:2 [▼
0 => array:2 [▼
"name" => "aa"
"value" => 22
]
1 => array:2 [▼
"name" => "bb"
"value" => 22
]
]
33 => array:3 [▼
0 => array:2 [▼
"name" => "bb"
"value" => 33
]
1 => array:2 [▼
"name" => "bb"
"value" => 33
]
2 => array:2 [▼
"name" => "bb"
"value" => 33
]
]
]