【问题标题】:get unique value from array and sum totals从数组和总和中获取唯一值
【发布时间】:2012-12-27 20:00:18
【问题描述】:

从这个Array() 我想获取amount_total、运输和合作伙伴的值,并按特定合作伙伴合计它们。因此,例如partner=>2665 的 amount_total 应该为 41.79 + 55.95 等等,请帮忙。我不想通过 SQL 来做,因为我也需要数据。

Array
(
    [0] => Array
    (
        [amount_total] => 41.79
        [amount_shipping] => 4.99
        [amount_partner] => 14.8
        [partner] => 2665
    )
    [1] => Array
    (
        [amount_total] => 55.95
        [amount_shipping] => 19.96
        [amount_partner] => 11
        [partner] => 2665
    )
    [2] => Array
    (
        [amount_total] => 51.96
        [amount_shipping] => 7.98
        [amount_partner] => 23.98
        [partner] => 51754
    )
    [3] => Array
    (
        [amount_total] => 24.55
        [amount_shipping] => 4.99
        [amount_partner] => 5.67
        [partner] => 11513
    )
)

【问题讨论】:

  • 这是一个数据库结果集吗?
  • 所以我在做 foreach($result as $res) { $partner[$res['partner']] = array ('amount_total'=> ? ); }
  • 是的,这是数据库结果

标签: php arrays multidimensional-array sum unique


【解决方案1】:

您可以使用 PHP 来实现这一点,但这不是必需的。 数据库可以更有效地做到这一点

我假设您当前的查询看起来像这样

SELECT
    `amount_total`,
    `amount_shipping`,
    `amount_partner`,
    `partner`
FROM
    `salesLeads`
WHERE
    [..]

MySQL 为您提供了很好的聚合函数,例如 SUM 您可以与 GROUP BY 一起使用

SELECT
    SUM( `amount_total` ) AS `amount_total`,
    SUM( `amount_shipping` ) AS `amount_shipping`,
    SUM( `amount_partner` ) AS `amount_partner`.
    `partner`
FROM 
    `salesLeads`
WHERE
     [..]
GROUP BY
     `partner`

在您的 PHP 脚本中,您可以以相同的方式访问它,但它已经由合作伙伴分组和汇总了最终数字

例如

if ($result = $mysqli->query($query)) {

    while ($row = $result->fetch_assoc()) {
        print_r( $row );
    }

    $result->close();
}

编辑

因为您想要一个 PHP 解决方案,它再次比查询两次更有效:

$partnerSums = array();
while ( $row = $result->fetch_assoc() ) {
     if ( !array_key_exists( $row['partner'], $partnerSums ) {
          $partnerSums[$row['partner']] = $row;
     } else {
          $partnerSums[$row['partner']]['amount_total'] += $row['amount_total'];
          $partnerSums[$row['partner']]['amount_shipping'] += $row['amount_shipping'];
          $partnerSums[$row['partner']]['amount_partner'] += $row['amount_partner'];
     }
}

print_r( $partnerSums );

【讨论】:

  • 其实没看过“不想在SQL中做,因为..”,看看fireeyedboys answer
  • 这似乎不起作用,它没有给我那个特定合作伙伴的总数
  • 您的示例合作伙伴$partnerSums[2665] 的结果是什么?请注意,我建议的代码旨在为您提供解决方案,而不是用于生产用途。例如,我对您如何连接到数据库知之甚少,结果迭代可能需要根据您的适配器进行调整
【解决方案2】:

我认为循环遍历这个数组并将总数存储在新数组中,同时检查in_array (more here) 就足够了。您需要做的就是每次循环遍历一个元素时,检查它是否已经在新数组中,如果是 - 执行必要的数学运算

【讨论】:

  • 所以我在做 foreach($result as $res) { $partner[$res['partner']] = array ('amount_total'=> ? ); }
【解决方案3】:

我会建议这样的事情:

   $res['totals']=array();

foreach($result as $res)
{
    $partner = $result['partner'];
    $res['totals'][$partner]+=$result['total_amount'];
}   

这样您就可以在一个地方获得所需的所有数据:合作伙伴数组“$res”。

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多