PHP Foreach различать значение, суммировать значение, группировать и показывать его на эхо - PullRequest
0 голосов
/ 30 января 2020

У меня есть массив json данных, я хочу суммировать значение и показать его на эхо с отчетливым, я прочитал другой поток об этом, но не могу понять это в моем случае.

JSON:

{
    "perusahaan": {
        "nomorLaporan": "blabla",
        "posisiDataTerakhir": "201912",
        "tanggalPermintaan": "blabla",
        "fasilitas": {
            "suratBerharga": [],
            "kreditPembiayan": [
                {
                    "ljk": "510",
                    "ljkKet": "BANK NATIONALNOBU",
                    "jumlahHariTunggakan": "0",
                    "nilaiProyek": "20000000000",
                    "plafonAwal": "20000000000",
                    "plafon": "20000000000"
                },
                {
                    "ljk": "503",
                    "ljkKet": "BANK NATIONALNOBU",
                    "jumlahHariTunggakan": "0",
                    "nilaiProyek": "15000000000",
                    "plafonAwal": "15000000000",
                    "plafon": "15000000000"
                },
                {
                    "ljk": "563",
                    "ljkKet": "BCA",
                    "jumlahHariTunggakan": "0",
                    "nilaiProyek": "15000000000",
                    "plafonAwal": "15000000000",
                    "plafon": "15000000000"
                },
                {
                    "ljk": "509",
                     "ljkKet": "BCA",
                      "jumlahHariTunggakan": "0",
                      "nilaiProyek": "15000000000",
                      "plafonAwal": "15000000000",
                     "plafon": "15000000000"
                 }
            ]
        }
    }
}

PHP:

$summedvalueshere=0;
$string = file_get_contents('ideb/NPWP.txt');
$json_a = json_decode($string, TRUE);
 foreach ($mainjson['perusahaan']['fasilitas']['kreditPembiayan'] as $v) {
 $summedvalueshere+=$v['plafonAwal'];
 echo $v['ljkKet']." = ".$summedvalueshere;
}

Но это показывает:

BANK NATIONALNOBU = 20000000000
BANK NATIONALNOBU = 35000000000
BCA = 50000000000
BCA = 65000000000

Что я ожидаю:

BANK NATIONALNOBU = 35000000000

BCA = 30000000000

Есть идеи как это решить? заранее спасибо ..

1 Ответ

1 голос
/ 30 января 2020

Вы можете сделать это следующим образом:

$string = file_get_contents('ideb/NPWP.txt');    
$mainjson = json_decode($string, TRUE);

//create an array to store the total values
$value_array = array(); 

//go over each item in the json
foreach ($mainjson['perusahaan']['fasilitas']['kreditPembiayan'] as $v) {

        //if an item with same name has been found add this value to it
    if(array_key_exists($v['ljkKet'], $value_array)){ 
        $value_array[$v['ljkKet']] += $v['plafonAwal'];
    }else{
        //else creat a new element in the array with current value

        $value_array[$v['ljkKet']] = $v['plafonAwal'];
    }

}
// display the results
// for each item in value array
foreach($value_array as $key => $value){
    // print the name and the value
    echo $key.' = '.$value.'<br>';
}

По сути, создайте другой массив, который хранит значения и добавляет их по мере их обнаружения. затем go по массиву и выводим результаты. Я устал писать в комментариях, чтобы помочь вам понять это лучше. Если у вас есть какие-либо вопросы, дайте мне знать.


РЕДАКТИРОВАТЬ:

В ответ на ваши комментарии. Вы можете разделить функциональность на разные функции и затем вызывать их для разных значений. см. код ниже:

$string = file_get_contents('ideb/NPWP.txt');        
$mainjson = json_decode($string, TRUE);

//setting main json path to branch_array, easyier to read.
$branch_array = $mainjson['perusahaan']['fasilitas']['kreditPembiayan'];

//sum the differnt values
//plafonAwal
$plafonAwal_array = sum_data($branch_array, 'plafonAwal'); 
//nilaiProyek
$nilaiProyek_array = sum_data($branch_array, 'nilaiProyek'); 
//jumlahHariTunggakan
$jumlahHariTunggakan_array = sum_data($branch_array, 'jumlahHariTunggakan'); 


//print the results
print_results($plafonAwal_array, 'plafonAwal');
echo '<br>';
print_results($nilaiProyek_array, 'nilaiProyek');
echo '<br>';
print_results($jumlahHariTunggakan_array, 'jumlahHariTunggakan');


// --- FUNCTIONS --- //
//add the values of specified key
function sum_data($data_array, $key_name){
    $value_array =array();

    foreach ($data_array as $v) {

        if(array_key_exists($v['ljkKet'], $value_array)){
            $value_array[$v['ljkKet']] += $v[$key_name];
        }else{

            $value_array[$v['ljkKet']] = $v[$key_name];
        }

    }

    return $value_array;
}

//function prints results of sums with a custom heading
function print_results($result_array, $heading=''){

    // if there is a heading print it out
    if($heading!=''){
        echo $heading.':<br>';
    }

    // display the results
    // for each item in $result_array
    foreach($result_array as $key => $value){

        echo $key.' = '.$value.'<br>';
    }

}

Я разделяю функциональность на 2 разные функции 1 добавляет значения, а другая выводит их на печать.

вывод выглядит примерно так:

plafonAwal:
BANK NATIONALNOBU = 35000000000
BCA = 30000000000

nilaiProyek:
BANK NATIONALNOBU = 35000000000
BCA = 30000000000

jumlahHariTunggakan:
BANK NATIONALNOBU = 0
BCA = 0

Сводная опция:

Если вы хотите, чтобы вы хотели получить список различных мест, вы можете использовать этот код:

$string = file_get_contents('ideb/NPWP.txt');    
$mainjson = json_decode($string, TRUE);

//setting main json path to branch_array, easyier to read.
$branch_array = $mainjson['perusahaan']['fasilitas']['kreditPembiayan'];

//create the summary array
$summary_array = create_summary($branch_array);
//print the results
print_summary($summary_array);

// --- FUNCTIONS --- //
function create_summary($data_array){
    $value_array = array();
    foreach ($data_array as $v) {
        //if haven't done a row for this loication set up a new array with defaults set to 0
        if(!isset($value_array[$v['ljkKet']])){
            $value_array[$v['ljkKet']] = array( 
                'plafonAwal'=> 0,
                'nilaiProyek'=> 0, 
                'jumlahHariTunggakan'=> 0, 

            );
        }
        // add the values to existing values
        $value_array[$v['ljkKet']]['plafonAwal'] += $v['plafonAwal'];
        $value_array[$v['ljkKet']]['nilaiProyek'] += $v['nilaiProyek'];
        $value_array[$v['ljkKet']]['jumlahHariTunggakan'] += $v['jumlahHariTunggakan'];

    }

    return $value_array;
}

function print_summary($summary_array){

    foreach ($summary_array as $location => $data) {
        echo "Summary for {$location}:<br>
        plafonAwal: {$data['plafonAwal']}<br>
        nilaiProyek: {$data['nilaiProyek']}<br>
        jumlahHariTunggakan: {$data['jumlahHariTunggakan']} <br><br>
        ";
    }
}

Пример вывод:

Summary for BANK NATIONALNOBU:
plafonAwal: 35000000000
nilaiProyek: 35000000000
jumlahHariTunggakan: 0

Summary for BCA:
plafonAwal: 30000000000
nilaiProyek: 30000000000
jumlahHariTunggakan: 0

Легко изменить форматирование резюме. Просто измените эхо в функции print_summary

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...