【问题标题】:PHP - Conditioned sum of some values of an arrayPHP - 数组某些值的条件总和
【发布时间】:2015-10-21 12:08:24
【问题描述】:

我在 PHP 中有一个这种类型的数组,由对 db 的特定查询产生。

$output = Array
(
  [0] => Array 
      (
       'price' => 100
       'date' => '2015-07-28'
       'total' => 200
       'qty' => 2
      )
  [1] => Array
      (
       'price' => 80
       'date' => '2015-07-28'
       'total' => 240
       'qty' => 3
      )
  [2] => Array
      (
       'price' => 100
       'date' => '2015-07-29'
       'total' => 300
       'qty' => 3
      )
  [3] => Array
      (
       'price' => 90
       'date' => '2015-07-28'
       'total' => 90
       'qty' => 1
      )
)

我正在尝试根据价格键值对总计和数量求和,获得一个如下所示的数组:

$grouped = Array
(
[0] => Array 
    (
     [price] => 100
     [sumtotal] => 500
     [sumqty] => 5
    )
 [1] => Array 
    (
     [price] => 80
     [sumtotal] => 240
     [sumqty] => 3
    )
 [2] => Array 
    (
     [price] => 90
     [sumtotal] => 90
     [sumqty] => 1
    )
 )

仍然找不到解决此问题的方法。

【问题讨论】:

标签: php arrays sum


【解决方案1】:

好的,这里有一个简单的完整代码来解决你的问题。

$output=array();//this is your array
$price_index=array();
$final_array=array();
foreach($output as $key=>$value)
{
    //first check if price is already in $price_index
    if(!isset($price_index[$value["price"]]))
    {
        $price_index[$value["price"]]=sizeof($price_index);
    }
    $final_index=$price_index[$value["price"]];
    if(isset($final_array[$final_index]))
    {
        $final_array[$final_index]["total"]+=$value["total"];
        $final_array[$final_index]["qty"]+=$value["qty"];
    }
    else
    {
        $final_array[$final_index]["total"]=$value["total"];
        $final_array[$final_index]["qty"]=$value["qty"];
        $final_array[$final_index]["price"]=$value["price"];
    }
}
//display our final array
print_r($final_array);

我做了什么:

  • 遍历您的数组
  • 检查当前价格是否之前已添加到 $final_array,方法是创建包含 price 作为键的 $price_index 数组,值为 $output 数组在价格第一次出现时的索引。
  • 现在如果价格再次出现,$price_index[current price] 将被检测为之前已经设置,然后我们将使用该值作为我们的 $final_array 的索引,并将当前的总数和数量添加到现有的.
  • 然后显示数组(可选)。

希望对您有所帮助。请不要只是复制我的代码,分析和理解它 mate :)

【讨论】:

  • 输出与问题中的第二个数组完全相同。
【解决方案2】:

我不明白,没有日期是同一个数组..?

编辑

好的,试试这个

    $temp= array();
for($i=0; $i<sizeof($outpout);$i++)
{

if(!isset($temp[$i]))
    $temp[$i]=array();
$temp[$i][$outpout[$i]['price']]+=$outpout[$i]['qty']];
}

$res=array();
$count=0;
foreach($temp as $key => $value)
{
    $res[$count]['price']=$key;
    $res[$count]['qty']=$value;
    $res[$count]['total']=$key*$value;
    $count++;
}

【讨论】:

  • 没有。如您所见,我有两个价格 = 100 的元素,所以我只是总结了这两个元素的数量和总数。
【解决方案3】:

尝试使用简单的foreach循环作为

$result = array();
foreach ($output as $key => $value) {
    $hash = $value['price'];
    if (isset($result[$hash])) {
        $result[$hash]['price'] = $value['price'];
        $result[$hash]['sumtotal'] += $value['total'];
        $result[$hash]['sumqty'] += $value['qty'];
    } else {
        $result[$hash]['price'] = $value['price'];
        $result[$hash]['sumtotal'] = $value['total'];
        $result[$hash]['sumqty'] = $value['qty'];
    }
}
print_r(array_values($result));

Demo

【讨论】:

  • 这是更好的方法:D
  • 请注意,这里的输出只是部分正确,因为输出数组索引将是 100,80,90 而不是 0,1,2
  • 我不这么认为你试过最后一行array_values($result) 它会成功0,1,2 而不是100,80,90 @VMcreator
  • 抱歉错过了那一行...我以为它只是 print_r()。我的错。
  • @VMcreator 没问题。祝你有美好的一天。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 2014-03-29
  • 2019-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多