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

Running total from array, starting from oldest date

所以我 运行 陷入了另一个……障碍。我真的一直在努力避免问这个问题,但我显然无法自己解决。我正在尝试显示 "account register"。我找到的示例按日期降序显示寄存器。我不明白为什么这不会惹恼任何试图使用它的人。我想在顶部而不是底部查看我最近的 t运行 操作。

本着这种精神,我正在努力解决这个问题。我觉得需要从数据库中取数据升序排列然后倒序排列。问题出在显示寄存器上。

因为它显示为 table,所以显然要从第一行开始。在这种情况下,第一行需要是最近的 t运行saction。由于无法从底部开始构建table,因此在开始构建table.

之前,数据集需要有序

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

这是我目前的代码。我不想在视图中进行数学运算。

型号

    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;万一我必须在将 $array 传递给视图数据之前对其进行操作。如果我最终不必这样做,我将在循环中执行 $data['array']。

[编辑]

为了回应 Abdulla 的评论,我想最简单的版本是,是的,我需要得到 运行 和 trans_amt。问题:

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

| 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

在数据库中添加一列来存储当前的余额值,然后按照你想要的时间倒序操作。从存储余额开始,作为 table 第 1 行中 Balance 列的值,然后 减去 存储余额中的 trans_amt 值并在下一行中使用该值。遍历你所有的行,你应该被设置。

原答案

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

在您的 Model 中,您需要将 select 语句更改为升序:

...
        ORDER BY
        trans_date
        ASC
...

并且在您的 Controller 中,在传递之前调用 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,但是您的程序,您的选择。