运行 数组中的总数,从最早的日期开始
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。问题:
- 如果它是数组中的第一个实例,初始 "running balance" 应该是 trans_amt 的值。
- 在下一行中,trans_amt 需要添加到当前 运行 余额中。如果是负值,说明是费用,显然要减去。这很容易处理。
- 我认为 运行 余额应该在显示之前计算,因为 a) 我必须从顶部开始构建 table,所以余额应该已经确定并且 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
在数据库中添加一列来存储当前的余额值,然后按照你想要的时间倒序操作。从存储余额开始,作为 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
,但是您的程序,您的选择。
所以我 运行 陷入了另一个……障碍。我真的一直在努力避免问这个问题,但我显然无法自己解决。我正在尝试显示 "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。问题:
- 如果它是数组中的第一个实例,初始 "running balance" 应该是 trans_amt 的值。
- 在下一行中,trans_amt 需要添加到当前 运行 余额中。如果是负值,说明是费用,显然要减去。这很容易处理。
- 我认为 运行 余额应该在显示之前计算,因为 a) 我必须从顶部开始构建 table,所以余额应该已经确定并且 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
在数据库中添加一列来存储当前的余额值,然后按照你想要的时间倒序操作。从存储余额开始,作为 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
,但是您的程序,您的选择。