像 mysql 查询一样按组做一个 sum(),但在 php 中用多个数组做一个 sum()


Do a sum() with group by thing like mysql query do but with multiple array in php

这是我现在正在做的事情,我从数据库中得到了一个这样的数组:

array (size=2)
  0 => 
    array (size=13)
      'wop_product_owner_id' => string '100007' (length=6)
      'wop_product_id' => string '100002' (length=6)
      'wop_product_price' => string '18.80' (length=5)
      'wop_product_count' => string '2.00' (length=4)
      'wop_product_unit' => string 'kg' (length=6)
  1 => 
    array (size=13)
      'wop_product_owner_id' => string '100007' (length=6)
      'wop_product_id' => string '100001' (length=6)
      'wop_product_price' => string '35.00' (length=5)
      'wop_product_count' => string '4.00' (length=4)
      'wop_product_unit' => string 'kg' (length=6)

我需要做的就是将每个项目与总计"wop_product_price*wop_product_count"合并为该数组中的新数组,它具有相同的"wop_product_owner_id",新数组应如下所示:

array (size=1) 
    0 => 
        array (size=5) 
            'woner_id' => string '100007' (length=6) 
            'woner_name' => string 'Jack' (length=6) 
            'woner_photo' => string '' (length=5) 
            'woner_total' => float '177.6.00' 
            'woner_paid' => boolean 'false' 

基本上,就像您在 Mysql 中使用 sum() 和分组一样进行查询。而且,我已经有一种方法可以做到这一点,这是代码:

$tmps = 数组();

    foreach ($products as $p) {
        $owner_id = $p['wop_product_owner_id'];
        if (empty($tmps)) {
            $tmps[] = array(
                'woner_id' => $p['wop_product_owner_id'],
                'woner_name' => $p['wop_product_owner_name'],
                'woner_photo' => $p['wop_product_owner_photo'],
                'woner_total' => (float) $p['wop_product_price'] * (float) $p['wop_product_count'],
                'woner_paid' => (int) $p['wop_product_payment_id'] > 0
            );
        } else {
            foreach ($tmps as $key => $value) {
                if (array_search($owner_id, $value) === FALSE) {
                    $tmps[] = array(
                        'woner_id' => $p['wop_product_owner_id'],
                        'woner_name' => $p['wop_product_owner_name'],
                        'woner_photo' => $p['wop_product_owner_photo'],
                        'woner_total' => (float) $p['wop_product_price'] * (float) $p['wop_product_count'],
                        'woner_paid' => (int) $p['wop_product_payment_id'] > 0
                    );
                } else {
                    $tmps[$key]['woner_total'] = (float) $tmps[$key]['woner_total'] + (float) $p['wop_product_price'] * (float) $p['wop_product_count'];
                }
            }
        }
    }
    return $tmps;

但是,我其实不喜欢它,我想一定有比这更优雅的方式!你怎么看?有什么想法吗?

你可以使用这个

foreach ($products as $p) {
    $owner_id = $p['wop_product_owner_id'];
    if (empty($tmps[$owner_id])) {
        $tmps[$owner_id] = array(
            'woner_id' => $p['wop_product_owner_id'],
            'woner_name' => $p['wop_product_owner_name'],
            'woner_photo' => $p['wop_product_owner_photo'],
            'woner_total' => (float) $p['wop_product_price'] * (float) $p['wop_product_count'],
            'woner_paid' => (int) $p['wop_product_payment_id'] > 0
        );
    } else {
                $tmps[$owner_id]['woner_total'] = (float) $tmps[$key]['woner_total'] + (float) $p['wop_product_price'] * (float) $p['wop_product_count'];

    }
}
return $tmps;
这是

来自@budirec的新方法:

    $tmps = array();
    foreach ($products as $p) {
        $owner_id = 'owner_' . $p['wop_product_owner_id'];
        if (!isset($tmps[$owner_id])) {
            $tmps[$owner_id] = array(
                'woner_id' => $p['wop_product_owner_id'],
                'woner_name' => $p['wop_product_owner_name'],
                'woner_photo' => $p['wop_product_owner_photo'],
                'woner_total' => (float) $p['wop_product_price'] * (float) $p['wop_product_count'],
                'woner_paid' => (int) $p['wop_product_payment_id'] > 0
            );
        } else {
            $tmps[$owner_id]['woner_total'] = (float) $tmps[$owner_id]['woner_total'] + (float) $p['wop_product_price'] * (float) $p['wop_product_count'];
        }
    }
    return $tmps;