-3
<?php 
error_reporting(E_ALL);
$test_array = Array(Array
(
    "pid" => 1,
    "encounter" => 20,
    "code" => abc,
    "fee" => 300.00
),
Array
(
    "pid" => 1,
    "encounter" => 20,
    "code" => abc,
    "fee" => 300.00
),
Array
(
    "pid" => 2,
    "encounter" => 20,
    "code" => abc,
    "fee" => 80
),
Array
(
    "pid" => 3,
    "encounter" => 20,
    "code" => xyz,
    "fee" => 90
),
Array
(
    "pid" => 5,
    "encounter" => 40,
    "code" => xyz,
    "fee" => 100
),
Array
(
    "pid" => 3,
    "encounter" => 40,
    "code" => xyz,
    "fee" => 100
),
Array
(
    "pid" => 2,
    "encounter" => 20,
    "code" => abc,
    "fee" => 80
),
Array
(
    "pid" => 1,
    "encounter" => 20,
    "code" => xyz,
    "fee" => 40
));
//Declaration...
$pre_pid = "";
$pre_encounter = "";
$pre_code = "";
$pre_fee = "";
$sum_charges = 0;
/*Foreach loop*/
$i=0;
foreach($test_array as $my_arr){
    $pre_pid = $my_arr['pid'];
    $pre_encounter = $my_arr['encounter'];
    $pre_code = $my_arr['code'];
    if($pre_pid == $my_arr['pid'] && $pre_encounter == $my_arr['encounter'] && $pre_code == $my_arr['code']){
        echo "FEE-AMOUNT=".$my_arr['fee'];
        $sum_charges+=$my_arr['fee'];
        echo '<br/>';
    }
$i++;
}
//Getting Sum = 1090
//Actual Sum I needed = 710
?>

Hello Friends I am trying above code where i want fee should be calculated of those who having same 3 key value pair. For Example IF each array 3 key values are same then calculate those fee amount only.

1 Answers1

0

if i understood your problem, you need to sum the fee column everytime the 3 other columns have the same value. I customised your code a bit so you can have the total cost for each of your elements.

//Declaration...
$pre_pid = "";
$pre_encounter = "";
$pre_code = "";
$pre_fee = "";
$sum_charges = 0;
$sum_array = array();
$total_fees = 0;
/*Foreach loop*/

foreach($test_array as &$my_arr){

    $pre_pid = $my_arr['pid'];
    $pre_encounter = $my_arr['encounter'];
    $pre_code = $my_arr['code'];
    $pre_fee = $my_arr['fee'];
    $fee_ammount = $pre_fee;
    $duplicates_check = array();

    foreach($test_array as $value) {
        if($pre_pid == $value['pid'] && ($pre_encounter != $value['encounter'] || $pre_code != $value['code'])){

            $duplicate = false;

            foreach($duplicates_check as $duplicate_array) {
                if($duplicate_array == $value)
                    $duplicate =true;
            }
            if(!$duplicate) {
                $fee_ammount += $value['fee'];
                $duplicates_check[] = $value;
            }
        }
    }
    $my_arr['total_fee'] = $fee_ammount;

    if(!isset($sum_array[$my_arr['pid']])) {
        $sum_array[$my_arr['pid']] = $my_arr['total_fee'];
        echo 'pid => '.$my_arr['pid'].', total fees => '.$my_arr['total_fee'].'<br />';
        $total_fees += $my_arr['total_fee'];
    }
}

echo 'Total : '.$total_fees;
var_dump($sum_array);
Alex
  • 478
  • 2
  • 11
  • I checked manually, there is no 710 sum for matching pid, encounter and code. Can you tell us which arrays have to be added to obtain 710 as an answer? – Alex Sep 23 '16 at 09:45
  • Pid 1 (Only 300+40) Pid 2 (80) Pid 3 (90+100) pid 5 (100) Here pid=1 case i want 300 only once because same pid,encounter and code. pid=3 case different encounter that's why 100 added. – THULASI DEVELOPER Sep 23 '16 at 09:49
  • working as per expectation thanks a lot sir really good logic appreciate – THULASI DEVELOPER Sep 23 '16 at 11:08
  • I have one more doubt how should i calculate sum here which is 710 out of loop – THULASI DEVELOPER Sep 23 '16 at 12:41
  • Modified the code, don't forget to check my answer if it fills your needs. Thanks – Alex Sep 23 '16 at 12:50
  • Thanks a lot sir if i have any issues in requirements then i ll post here – THULASI DEVELOPER Sep 23 '16 at 13:04
  • Then i recommand you to go check the array_unique() function from php, that way you clean the array before you loop inside so you don't have to check for duplicates inside. http://php.net/manual/fr/function.array-unique.php – Alex Sep 23 '16 at 13:52