首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在PHP的表格中计算小计和合计?

如何在PHP的表格中计算小计和合计?
EN

Stack Overflow用户
提问于 2018-08-10 21:03:22
回答 1查看 78关注 0票数 -1

我的脚本是这样的:

代码语言:javascript
复制
<?php
    $data = array(
        array('transaction_number' => 'AB-0001','date' => '2018-08-01', 'item_number' => '0101010', 'desc' => 'This is a', 'variant_code' => '002', 'quantity' => '2','cost' => '2000'),
        array('transaction_number' => 'AB-0001','date' => '2018-08-01', 'item_number' => '0101010', 'desc' => 'This is a', 'variant_code' => '004', 'quantity' => '3','cost' => '2000'),
        array('transaction_number' => 'AB-0001','date' => '2018-08-01', 'item_number' => '0101010', 'desc' => 'This is a', 'variant_code' => '005', 'quantity' => '4','cost' => '2000'),
        array('transaction_number' => 'AB-0001','date' => '2018-08-01', 'item_number' => '0101010', 'desc' => 'This is a', 'variant_code' => '006', 'quantity' => '5','cost' => '2000'),
        array('transaction_number' => 'AB-0001','date' => '2018-08-01', 'item_number' => '0101010', 'desc' => 'This is a', 'variant_code' => '008', 'quantity' => '1','cost' => '2000'),
        array('transaction_number' => 'AB-0002','date' => '2018-08-02', 'item_number' => '0101010', 'desc' => 'This is b', 'variant_code' => '013', 'quantity' => '2','cost' => '2000'),
        array('transaction_number' => 'AB-0002','date' => '2018-08-02', 'item_number' => '0101010', 'desc' => 'This is b', 'variant_code' => '020', 'quantity' => '3','cost' => '2500'),
        array('transaction_number' => 'AB-0002','date' => '2018-08-02', 'item_number' => '0101010', 'desc' => 'This is b', 'variant_code' => '022', 'quantity' => '4','cost' => '2500'),
        array('transaction_number' => 'AB-0003','date' => '2018-08-03', 'item_number' => '0101010', 'desc' => 'This is c', 'variant_code' => '007', 'quantity' => '1','cost' => '2500'),
        array('transaction_number' => 'AB-0003','date' => '2018-08-03', 'item_number' => '0101010', 'desc' => 'This is c', 'variant_code' => '015', 'quantity' => '7','cost' => '2500')
    );
?>
<table>
    <tr>
        <th>transaction_number</th>
        <th>date</th>
        <th>item_number</th>
        <th>desc</th>
        <th>variant_code</th>
        <th>quantity</th>
        <th>cost</th>
    </tr>
    <?php
    foreach($data as $key=>$value) {
    ?>
    <tr>
        <td><?php echo $value['transaction_number'] ?></td>
        <td><?php echo $value['date'] ?></td>
        <td><?php echo $value['item_number'] ?></td>
        <td><?php echo $value['desc'] ?></td>
        <td><?php echo $value['variant_code'] ?></td>
        <td><?php echo $value['quantity'] ?></td>
        <td><?php echo $value['cost'] ?></td>
    </tr>
    <?php 
    }
    ?>
</table>

如果执行脚本,结果如下所示:

我想要这样的结果:

我该怎么做呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-10 23:01:46

要实现您的目标,可能有几种方法-我选择使用数组来存储新发现的事务编号和日期。通过测试一个项目是否已经在数组中,您可以声明新的变量/对象,然后在呈现的输出中使用这些变量/对象。

代码语言:javascript
复制
<?php
    $data = array(
        array('transaction_number' => 'AB-0001','date' => '2018-08-01', 'item_number' => '0101010', 'desc' => 'This is a', 'variant_code' => '002', 'quantity' => '2','cost' => '2000'),
        array('transaction_number' => 'AB-0001','date' => '2018-08-01', 'item_number' => '0101010', 'desc' => 'This is a', 'variant_code' => '004', 'quantity' => '3','cost' => '2000'),
        array('transaction_number' => 'AB-0001','date' => '2018-08-01', 'item_number' => '0101010', 'desc' => 'This is a', 'variant_code' => '005', 'quantity' => '4','cost' => '2000'),
        array('transaction_number' => 'AB-0001','date' => '2018-08-01', 'item_number' => '0101010', 'desc' => 'This is a', 'variant_code' => '006', 'quantity' => '5','cost' => '2000'),
        array('transaction_number' => 'AB-0001','date' => '2018-08-01', 'item_number' => '0101010', 'desc' => 'This is a', 'variant_code' => '008', 'quantity' => '1','cost' => '2000'),
        array('transaction_number' => 'AB-0002','date' => '2018-08-02', 'item_number' => '0101010', 'desc' => 'This is b', 'variant_code' => '013', 'quantity' => '2','cost' => '2000'),
        array('transaction_number' => 'AB-0002','date' => '2018-08-02', 'item_number' => '0101010', 'desc' => 'This is b', 'variant_code' => '020', 'quantity' => '3','cost' => '2500'),
        array('transaction_number' => 'AB-0002','date' => '2018-08-02', 'item_number' => '0101010', 'desc' => 'This is b', 'variant_code' => '022', 'quantity' => '4','cost' => '2500'),
        array('transaction_number' => 'AB-0003','date' => '2018-08-03', 'item_number' => '0101010', 'desc' => 'This is c', 'variant_code' => '007', 'quantity' => '1','cost' => '2500'),
        array('transaction_number' => 'AB-0003','date' => '2018-08-03', 'item_number' => '0101010', 'desc' => 'This is c', 'variant_code' => '015', 'quantity' => '7','cost' => '2500')
    );

    $symbol='£';
?>
<!doctype html>
<html>
    <head>
        <meta charset='utf-8' />
        <title>HTML table based upon PHP array data</title>
        <style>
            table{ border:1px solid gray;font-family:calibri,verdana,arial;float:none;margin:auto; }
            th{background:gray;color:white;padding:0.5rem;}
            td{padding:0.5rem;border:1px dotted gray;}
            td[colspan]{background:whitesmoke;}
            .currency:before{
                content:'<?=$symbol;?>';
                color:green;
                font-weight:bold;
            }
        </style>
    </head>
    <body>
        <table>
            <tr>
                <th>transaction_number</th>
                <th>date</th>
                <th>item_number</th>
                <th>desc</th>
                <th>variant_code</th>
                <th>quantity</th>
                <th>cost</th>
            </tr>
            <?php

                $trans=array();
                $dates=array();

                $total=new stdClass;
                $total->qty=0;
                $total->cost=0;


                foreach( $data as $index => $a ){
                    /*
                        Transaction number & date variables
                        - empty unless not in array
                    */
                    $tn='';
                    $dt='';

                    /* check if current transaction is already in the array - if not add it and create a new subtotal object */
                    if( !in_array( $a['transaction_number'], $trans ) ) {
                        /* assign `$dt` variable to newly discovered transaction and add to array */
                        $tn = $trans[] = $a['transaction_number'];

                        $subtotal=new stdClass;
                        $subtotal->qty=0;
                        $subtotal->cost=0;
                    }
                    /* Check if the date is in it's array - if not, add it */
                    if( !in_array( $a['date'], $dates ) ) {
                        /* assign `$dt` var to newly discovered date and add to array */
                        $dt = $dates[] = $a['date'];
                    }

                    /* update subtotals */
                    $subtotal->qty += floatval( $a['quantity'] );
                    $subtotal->cost += floatval( $a['cost'] );


                    /* output the table row with data including vars defined above */
                    printf('
                    <tr>
                        <td>%s</td>
                        <td>%s</td>
                        <td>%s</td>
                        <td>%s</td>
                        <td>%s</td>
                        <td>%s</td>
                        <td>%s</td>
                    </tr>', $tn, $dt, $a['item_number'], $a['desc'], $a['variant_code'], $a['quantity'], $a['cost'] );


                    /* Show the sub-total for current transaction number */
                    if( ( $index < count( $data ) - 1 && $trans[ count( $trans )-1 ] != $data[ $index + 1 ]['transaction_number'] ) or $index==count( $data )-1 ){
                        printf('
                        <tr>
                            <td colspan=4>&nbsp;</td>
                            <td>SUB-TOTAL</td>
                            <td>%s</td>
                            <td class="currency">%s</td>
                        </tr>', $subtotal->qty, $subtotal->cost );

                        $total->qty += floatval( $subtotal->qty );
                        $total->cost += floatval( $subtotal->cost );
                    }
                }

                /* Show the final totals */
                printf('
                <tr><td colspan=7>&nbsp;</td></tr>
                <tr>
                    <td colspan=4>&nbsp;</td>
                    <td>TOTAL</td>
                    <td>%s</td>
                    <td class="currency">%s</td>
                </tr>', $total->qty, $total->cost );

            ?>
        </table>
    </body>
</html>

Or a live proof of concept can hopefully be found here

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51787210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档