【发布时间】:2022-01-19 11:23:27
【问题描述】:
我有这个源数组():
$source[]
[
["user_id": 1, "item_id": 991, "quantity": 100],
["user_id": 1, "item_id": 992, "quantity": 50],
["user_id": 1, "item_id": 993, "quantity": 300],
["user_id": 1, "item_id": 992, "quantity": 150],
["user_id": 2, "item_id": 991, "quantity": 75],
["user_id": 2, "item_id": 992, "quantity": 20],
["user_id": 3, "item_id": 991, "quantity": 200],
["user_id": 3, "item_id": 992, "quantity": 425],
["user_id": 3, "item_id": 991, "quantity": 100],
["user_id": 3, "item_id": 992, "quantity": 75]
]
我的目标是减少它,以便我只得到 1 个 user_id 和 item_id 相同的项目:
$result[]
[
["user_id": 1, "item_id": 991, "quantity": 100],
["user_id": 1, "item_id": 992, "quantity": 200],
["user_id": 1, "item_id": 993, "quantity": 300],
["user_id": 2, "item_id": 991, "quantity": 75],
["user_id": 2, "item_id": 992, "quantity": 20],
["user_id": 3, "item_id": 991, "quantity": 300],
["user_id": 3, "item_id": 992, "quantity": 500]
]
最终的方法是使用 array_reduce,但我会使用 foreach 循环。
我试过了,但我得到一个空数组
$result = array_reduce($source, function($a, $b)
{
if (($a->user_id === $b->user_id) && ($a->item_id === $b->item_id))
{
$a->quantity += $b->quantity; return $a;
}
else
{
return $b;
}
}, []);
或者这个,但我得到一个以user_id 作为索引和quantity 作为总价值的数组,而不是由item_id 分开:
$result = array_reduce($source, function($a, $b)
{
(($a[$b["user_id"]] = $a[$b["user_id"]]) && ($a[$b["item_id"]] = $a[$b["item_id"]])) ?? 0;
$a[$b["user_id"]] += $b["quantity"];
return $a;
}, []);
我开始尝试使用带有if (isset[...]) 的foreach 循环,但我觉得无论$result[] 数组的索引如何,它都会返回true。
【问题讨论】:
标签: php arrays sum array-reduce