PHP - 求和数组键值,其中 2 个或多个其他键相等,同时保持数组结构
Posted
技术标签:
【中文标题】PHP - 求和数组键值,其中 2 个或多个其他键相等,同时保持数组结构【英文标题】:PHP - Sum Array key value where 2 or more other keys are equal while keeping array structure 【发布时间】: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。
【问题讨论】:
【参考方案1】:你可以使用array_reduce
函数在下一个方式:
$res = array_reduce (
$source,
function($res, $el)
if (isset($res[$el['user_id'].$el['item_id']]))
// if user_id with item_id exist
// increase quantity by $el['quantity']
$res[$el['user_id'].$el['item_id']]['quantity'] += $el['quantity'];
else
// create record with unique key for each user_id & item_id
// using concatenation
$res[$el['user_id'].$el['item_id']] = $el;
return $res;
,
[] // initial result - empty array
);
// output result values without keys
print_r(array_values($res));
php array_reduce online
【讨论】:
好的,所以你通过连接user_id
和item_id
来创建带有自定义索引的$result
数组,然后你用array_values
去掉这个索引。不错,我试试看
您可以在线查看工作代码示例phpize.online/sql/mysql57/undefined/php/php8/…以上是关于PHP - 求和数组键值,其中 2 个或多个其他键相等,同时保持数组结构的主要内容,如果未能解决你的问题,请参考以下文章