我有一个名为dt_account Data的数据库表,其 struct 大致如下:

enter image description here

以及一个名为dt_jurnaltransaksi的事务表,其 struct 如下:

enter image description here

这是使用子父树查询上面的表的结果,这是在我的代码中发生的情况:

enter image description here

这是我应该得到的结果,也是我想要的结果,所以total个数据也在父帐户中

enter image description here

这是我使用的php文件

<?php
#MUTASI DEBIT KREDIT
$sql_labarg = "SELECT  
        T1.uq_account,
        T1.kd_parent,  
        T1.nama_akun,   
        T1.main, 
        SUM(T2.debit) AS debit, 
        SUM(T2.kredit) AS kredit 
    FROM dt_account AS T1
    LEFT JOIN dt_jurnaltransaksi AS T2 
        ON T2.uq_account = T1.uq_account 
    GROUP BY T1.uq_account 
    ORDER BY T1.id_sort ASC, T1.kd_account 
";  ?>

<div class="mt-4 p-6 shadow-[0_2px_20px_-5px_rgba(0,0,0,0.1)] rounded bg-white">  
    <div class="w-full max-lg:px-3 max-lg:mt-8"> 
        <div class="p-0 m-0"> <?php  
            $data = array();
            $query  = mysqli_query($db, $sql_labarg);
            while($row = mysqli_fetch_assoc($query)) {
                $sb_countv = $db->query("SELECT 
                        SUM(T2.kredit) - SUM(T2.debit) AS nominal_hr 
                    FROM dt_account AS T1  
                    LEFT JOIN dt_jurnaltransaksi AS T2 
                        ON T2.uq_account = T1.uq_account  
                    WHERE T1.kd_parent = '{$row['uq_account']}' 
                ")->fetch_assoc(); 
                
                $tmp[$row['uq_account']]['uq_account']  = $row['uq_account'];
                $tmp[$row['uq_account']]['kd_parent']   = $row['kd_parent']; 
                $tmp[$row['uq_account']]['nama_akun']   = $row['nama_akun'];
                $tmp[$row['uq_account']]['main']        = $row['main'];  
                
                #AKUN
                $tmp[$row['uq_account']]['debit']   = $row['debit'];
                $tmp[$row['uq_account']]['kredit']  = $row['kredit']; 

                $tmp[$row['uq_account']]['nominal_hr']  = $sb_countv['nominal_hr']; 

                if ($row['kd_parent'] == '0') {
                    $data[$row['uq_account']]  = &$tmp[$row['uq_account']];
                } else { 
                    $tmp[$row['kd_parent']]['child'][$row['uq_account']] = &$tmp[$row['uq_account']];
                }
            }    

            function build_laba($array, $child = false) {   
                $html = '<table class="table w-[calc(100%+1px)] left-[-1px]">';
                foreach ($array as $arr) { 
                    $nominal    = $arr['pos_saldo'] == 'debit' ? 
                                  $arr['kredit'] - $arr['debit'] : 
                                  $arr['debit'] - $arr['kredit'];
                    $nomittl    = $arr['nominal_hr'];
                    $nominal    = number_format($nominal, 0, '.', '.'); 

                    if($arr['main'] == 0){
                        $html .= '
                        <tr class="border-0 border-l">
                            <td class="p-0 pl-4"> 
                                <div class="py-1 my-1"> 
                                    <div class="flex flex-nowrap space-x-2 px-2"> 
                                        <div class="flex-1"> 
                                            <i class="fa-regular fa-folder-closed"></i>
                                            <span class="font-semibold text-sm">
                                              '.$arr['nama_akun'].'
                                            </span>
                                        </div> 
                                    </div>
                                </div>'; 

                                if (key_exists('child', $arr)) { 
                                    $html .= build_laba($arr['child'], true);
                                } 
                                
                                $html .= ' 
                            </td>
                        </tr>'; 
                    } else{
                        $html .= '
                        <tr class="border-0 '.$brdr.'"> 
                            <td class="p-0 '.$hder.'"> 
                                <div class="py-1 hover:!bg-gray-100 text-gray-600"> 
                                    <div class="flex flex-nowrap space-x-2 px-2"> 
                                        <div class="flex-1"> 
                                            <i class="fa-regular fa-folder"></i>
                                            <span class="text-sm">'.$arr['nama_akun'].'</span>
                                        </div> 
                                        
                                        <div class="flex-0">'.$nominal.'</div> 
                                    </div> 
                                </div>
                            </td> 
                        </tr> ';
                    } 

                    #TOTAL AKUN
                    if($arr['main'] == 0){
                        $html .= '
                        <tr class="border-0 '.$brdr.'">
                            <td class="p-0 '.$hder.'"> 
                                <div class="py-1 my-1 '.$hdbg.'"> 
                                    <div class="flex flex-nowrap space-x-2 px-2"> 
                                        <div class="flex-1"> 
                                            <i class="fa-regular fa-folder-closed"></i>
                                            <span class="font-semibold text-sm">
                                              Total '.$arr['nama_akun'].'
                                            </span>
                                        </div> 

                                        <div class="flex-0">
                                          '.number_format($nomittl, 0, '.', '.').'
                                         </div> 
                                    </div>
                                </div> 
                            </td>
                        </tr>'; 
                    } 
                } 

                $html .= '</table>';
                return $html;
            }

            echo build_laba($data); 
        ?>   
        </div> 
    </div> 
</div> 

推荐答案

以下是代码的修改版本,它应该正确计算子 node 的总和,并将其添加到父 node 的总和中.

function calculateTotal(&$array) {
    $total = 0;
    foreach ($array as &$arr) {
        if (isset($arr['child'])) {
            $arr['nominal_hr'] += calculateTotal($arr['child']);
        }
        $total += $arr['nominal_hr'];
    }
    return $total;
}

// Call the function on your data array
calculateTotal($data);

// Now you can build your table as before
echo build_laba($data);

Php相关问答推荐

PHP在将数组子集赋给变量时是否复制数组子集?

Laravel—通过单击处理多条路由

输入手写CSV时在PHP中进行日期判断

在WooCommerce Checkout帐单地址字段后插入自定义按钮

PHP邮件表单无法识别重音/特殊字符

LaravelEloquent 的地方条件父/子与第三模型多对多

PHP-转义字符串内的双反斜杠

使用列入黑名单的单词和自定义业务逻辑的组合将特定的子字符串包装在HTML标记中

根据选定的字段值显示或隐藏WooCommerce注册字段

如何使用barryvdh/laravel-Snappy在两个打印页面上将表格分成两部分?

将购物车按钮重定向到Checkout-Wooccommerce

dyld[45923]:未加载库:/usr/local/opt/libavif/lib/libavif.15dylib

添加不存在的订单元数据以扩展WooCommerce针对特定产品的管理订单搜索

计算添加到购物车的点击次数并将其显示在 WooCommerce 管理产品列表中

如何通过额外的属性和本地化来使用 laravel 枚举

从 laravel 中的日期类型中删除时间

将变量从中间件传递到控制器 Laravel

如何在 Laravel 9 中判断异常是否可报告?

路由未定义的 laravel 导出

Laravel 自定义中间件:ERR_TOO_MANY_REDIRECTS