0

我有这个源数组():

$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]
]  

我的目标是减少它,以便我只得到一个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;
 }, []);

我开始尝试使用foreach循环,if (isset[...])但我觉得无论$result[]数组的索引如何,它都会返回 true。

4

1 回答 1

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 在线

于 2021-12-16T11:17:08.180 回答