使用从另一个数组过滤的array_sum()

时间:2017-10-02 17:53:32

标签: php arrays

$type=array("debit", "credit", "credit", "credit", "debit");

$amount=array(20,30,40,50,60);

如何array_sum所有debit值或所有credit值?

预期结果: 借方= 20 + 60 = 80 信用= 30 + 40 + 50 = 120

我尝试过滤它然后使用array_sum但不工作。

function filterDebit($finddebit){
    return ($finddebit == "debit");
}
$finaldebit = array_filter($type, 'filterDebit');
echo array_sum($finaldebit);

6 个答案:

答案 0 :(得分:2)

你不可能通过这种方式获得总和,因为你实际上并没有对金额数据做任何事情,但你已经非常接近了。

您可以使用array_intersect_key查找$amount中与过滤的$types数组中的键匹配的条目。

echo array_sum(array_intersect_key($amount, $finaldebit));

如果有可能,我认为最好在某个时间点解决这个问题,因此这两组关联值不会像这样在这样的单独数组中结束如果这两个数组来自数据库,它可以更有效地处理这种过滤/聚合,但由于我不知道数组的来源,我没有建议为此。

答案 1 :(得分:2)

您可以在没有任何复杂逻辑的情况下执行此操作:(内联说明)

$type = array('debit', 'credit', 'credit', 'credit', 'debit');

$amount = array(20, 30, 40, 50, 60);

$sum = array_fill_keys(array_unique($type), 0);  // initialize the empty associative array with possible keys from $type array

foreach ($type as $key => $t) {
    $sum[$t] += $amount[$key]; // Sum up the values based on keys
}

print_r($sum);

<强>打印

Array
(
    [debit] => 80
    [credit] => 120
)

注意:确保两个数组都保持正确的值。由于两者不同,如果值不匹配,可能会有一些差异!

答案 2 :(得分:1)

您可以使用@Don't Panic的答案,也可以手动执行for循环

function sumType($type, $amount, $key){
    $sum = 0;
    for($i = 0; $i < sizeOf($type); $i++){
        if ($type[$i] == $key){
            $sum += $amount[$i];
        }
    }
    return $sum;
}

$type=array("debit", "credit", "credit", "credit", "debit");
$amount=array(20,30,40,50,60);

echo sumType($type, $amount, 'debit'); // 80
echo sumType($type, $amount, 'credit'); // 120

答案 3 :(得分:1)

@ Don's Panic更具体,但你也可以这样做。

<?php

$type=array("debit", "credit", "credit", "credit", "debit");

$amount=array(20,30,40,50,60);

function filter_price($types, $amount, $type){
    if($type == 'debit'){
        $key = 'debit';
    }else{
        $key = 'credit';
    }
    $sum = 0;
    foreach($types as $index->$type){
        if($type == $key){
            $sum += $amount[$index];
        }
    }
    return $sum;
}
echo filter_price($type, $amount, 'debit');
echo filter_price($type, $amount, 'credit');

答案 4 :(得分:1)

这可能是一种令人费解的方式 - 不仅是借记,还有$type中的任何独特价值:

foreach(array_unique($type) as $flag) {
   $i = -1;
   ${'sum_'.$flag} = array_reduce($amount, function($carry, $item) use($type, &$i, $flag) {
       $i++;
       return $carry += $type[$i] == $flag ? $item : 0;
   }, 0);
}
echo $sum_debit; //80
echo $sum_credit; //120

答案 5 :(得分:0)

$types=array("debit", "credit", "credit", "credit", "debit");

$amount=array(20,30,40,50,60);

function getSum ($type, $typeArr, $amountArr) {
  $sum = 0;
  $r = array_keys($typeArr, $type);
  foreach ($r as $idx) {
    $sum = $sum + (int)$amountArr[$idx];
  }
  return $sum;
}