从最早的日期开始从数组运行总计

时间:2016-06-19 04:51:50

标签: php codeigniter codeigniter-3

所以我遇到了另一个......顺便说一句。我一直试图避免提出这个问题,但我显然无法自己解决这个问题。我正在尝试显示“帐户注册”。我发现的例子按日期按降序显示寄存器。我不明白为什么那不会惹恼任何试图使用它的人。我希望看到我最近的交易位于顶部,而不是底部。

本着这种精神,我正在努力解决这个问题。我我需要按升序从数据库中获取数据,然后反转数组。问题在于显示寄存器。

由于它显示为一个表格,显然它将从第一行开始。在这种情况下,第一行需要是最近的事务。由于我无法从底部开始构建表,因此在开始构建表之前,数据集必须按顺序排列。

一切都很好。它完全按照应有的方式显示,除了运行总计。谷歌搜索这种东西让我有机会做一个运行总计,如果你从数组的开头开始,这很容易。

所以这是我到目前为止的代码。我不想在视图中进行数学计算。

模型

    public function get_register($acct_id = NULL) {
    $limit = strtotime("now") + 2592000;
    if ($acct_id == NULL) {
        $sql = "
            SELECT 
            bdgt_trans.trans_amt,
            bdgt_trans.clr_flag,
            bdgt_trans.memo,
            bdgt_trans.trans_date,
            bdgt_trans.chk_num,
            bdgt_cat.cat_label,
            bdgt_payee.disp_name
            FROM bdgt_acct
            JOIN
            bdgt_trans ON bdgt_trans.bdgt_acct_id = bdgt_acct.id
            JOIN
            bdgt_cat ON bdgt_cat.id = bdgt_trans.bdgt_cat_id
            JOIN
            bdgt_payee ON bdgt_payee.id = bdgt_trans.payee_id
            WHERE
            bdgt_acct.acct_default = 1
            AND
            trans_date <= ?
            ORDER BY
            trans_date
            DESC
        ";
        $query = $this -> db -> query($sql, $limit);
    } else {
        $sql = "
            SELECT 
            bdgt_trans.trans_amt,
            bdgt_trans.clr_flag,
            bdgt_trans.memo,
            bdgt_trans.trans_date,
            bdgt_trans.chk_num,
            bdgt_cat.cat_label,
            bdgt_payee.disp_name
            FROM bdgt_acct
            JOIN
            bdgt_trans ON bdgt_trans.bdgt_acct_id = bdgt_acct.id
            JOIN
            bdgt_cat ON bdgt_cat.id = bdgt_trans.bdgt_cat_id
            JOIN
            bdgt_payee ON bdgt_payee.id = bdgt_trans.payee_id
            WHERE
            bdgt_acct.id = ?
            AND
            trans_date <= ?
            ORDER BY
            trans_date
            DESC
        ";
        $query = $this -> db -> query($sql, array($acct_id, $limit));
    }
    if ($query -> num_rows() > 0) {
        foreach ($query->result() AS $row) {
            $array[] = get_object_vars($row);
        }
        return $array;
    } else {
        return NULL;
    }
}

控制器

    public function index() {
    $acct_id = $this -> uri -> segment(3);
    $data['acct_balance'] = $this -> base -> account_balance($acct_id);
    $data['register_table'] = $this -> read -> get_register($acct_id);
    $data['accounts'] = $this -> base -> acct_list();
    $sum = 0;

    if (!empty($data['register_table'])) {
        foreach ($data['register_table'] AS $ra) {
            if (current($data['register_table']) == $data['register_table']) {
                $sum = $ra['trans_amt'];
            } else {
                $sum = $sum += $ra['trans_amt'];
            }
            $array[] = array('clr_flag' => $ra['clr_flag'], 'trans_date' => $ra['trans_date'], 'disp_name' => $ra['disp_name'], 'chk_num' => $ra['chk_num'], 'cat_label' => $ra['cat_label'], 'trans_amt' => $ra['trans_amt'], $ra['sum'] = $sum);
        }
        $data['array'] = $array;
    }

    if ($this -> form_validation -> run() === FALSE) {
        $this -> stencil -> paint('finance/view_register', $data);
    } else {
        redirect(base_url() . 'finance/view_register/' . $acct_id);
    }

}

查看

                        if (!empty($array)) {
                        foreach ($array AS $rt) {
                            echo '<tr';
                            if ($rt['clr_flag'] == 0) {
                                echo ' class="alert alert-warning"';
                            }
                            echo '><td>' . date("m/d/Y", $rt['trans_date']) . '</td><td>' . $rt['disp_name'] . '</td><td>';
                            if ($rt['chk_num'] == 0) {
                                echo 'N/A';
                            } else {
                                echo $rt['chk_num'];
                            }
                            echo '</td><td>' . $rt['cat_label'] . '</td>';
                            echo '<td>' . $rt['trans_amt'] . '</td>';
                            echo '<td>' . $rt['sum'] . '</td>';
                            echo '<td>';
                            echo $rt['cat_label'] != "Manual Adjustment" ? '
                                <input type="button" value="Clear" onClick="javascript:;" class="btn btn-primary" />
                            ' : '';
                            echo '<input type="button" value="Edit" onClick="javascript:;" class="btn btn-primary" />
                                  <input type="button" value="Delete" onClick="javascript:;" class="btn btn-primary" />';
                            echo '</td>';
                            echo '</tr>';
                        }
                    }

我试图将事情分解,以便尽可能容易理解。在控制器中,我正在做$ data ['array'] = $ array;以防我必须在将$数组传递给视图数据之前对其进行操作。如果我不想这样做,我将在循环中执行$ data ['array']。

[编辑]

在回应Abdulla的评论时,我认为非常简化的版本是,我需要获得trans_amt的运行总和。问题:

  • 如果它是数组中的第一个实例,则初始“运行余额”应为trans_amt的值。
  • 在下一行中,需要将trans_amt添加到当前运行余额中。如果它是负值,表示费用,显然会减去。这很容易处理。
  • 我认为应该在显示之前计算运行余额,因为a)我必须从顶部开始构建表格,因此应该已经确定了余额并且b)我不想在显示中进行任何计算视图层,它应该在控制器或模型中处理(如果绝对必要或比在控制器中执行它容易一百倍)。

所以基本上,结果输出应该是这样的:

| Date       | Payee              | Amount | Balance |
| 01/03/2000 | Burgers-R-Us       | -5.00  | 120.00  |
| 01/03/2000 | Check from Grandma | 50.00  | 125.00  |
| 01/02/2000 | Platinum Gym       | -25.00 | 75.00   |
| 01/01/2000 | Starting Balance   | 100    | 100.00  |

1 个答案:

答案 0 :(得分:1)

编辑1

向数据库添加一列以存储当前余额值,然后按所需的反向时间顺序对其进行操作。从存储的余额开始,作为表格第1行中Balance列的值,然后从存储的余额中减去 trans_amt值,并在下一个值中使用该值行。循环遍历所有行,您应该设置。

原始答案

您可以按时间顺序(最旧 - >最新)顺序构建表格,然后在控制器中执行array_reverse(),然后将其传递给视图以获得所需的反向时间顺序(最新 - >最旧)顺序。

模型中,您需要将select语句更改为升序:

...
        ORDER BY
        trans_date
        ASC
...

在您的控制器中,在将其关闭之前调用array_reverse()方法:

public function index() {
    $acct_id = $this -> uri -> segment(3);
    $data['acct_balance'] = $this -> base -> account_balance($acct_id);
    $data['register_table'] = $this -> read -> get_register($acct_id);
    $data['accounts'] = $this -> base -> acct_list();
    $sum = 0;

    if (!empty($data['register_table'])) {
        foreach ($data['register_table'] AS $ra) {
            if (current($data['register_table']) == $data['register_table']) {
                $sum = $ra['trans_amt'];
            } else {
                $sum = $sum + $ra['trans_amt'];
            }
            $array[] = array('clr_flag' => $ra['clr_flag'], 'trans_date' => $ra['trans_date'], 'disp_name' => $ra['disp_name'], 'chk_num' => $ra['chk_num'], 'cat_label' => $ra['cat_label'], 'trans_amt' => $ra['trans_amt'], $ra['sum'] = $sum);
        }
        $data['array'] = array_reverse($array); // <- Perform an array reverse here to flip the order
    }

    if ($this -> form_validation -> run() === FALSE) {
        $this -> stencil -> paint('finance/view_register', $data);
    } else {
        redirect(base_url() . 'finance/view_register/' . $acct_id);
    }

}

此外,虽然与问题直接无关,但为了便于阅读,您可以考虑将$sum变量重命名为$balance$running_bal,但是您的选择是您的程序。