【问题标题】:PHP - Sum Array key value where 2 or more other keys are equal while keeping array structurePHP - 求和数组键值,其中 2 个或多个其他键相等,同时保持数组结构
【发布时间】: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_iditem_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


    【解决方案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_iditem_id来创建带有自定义索引的$result数组,然后你用array_values去掉这个索引。不错,我试试看
    • 您可以在线查看工作代码示例phpize.online/sql/mysql57/undefined/php/php8/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多