假设我有以下数组:
$array = [
['time_spent' => 10, 'rate' => 150],
['time_spent' => 20, 'rate' => 100]
];
我希望表格如下所示:
它有2行4列(花费的时间,费率,总计,总计):
第一行将是:
10 | 150 | 10 x 150 = 1500 | 3500
第二行:
20 | 100 | 10 x 200 = 2000
(3500是两个记录的总和)
答案 0 :(得分:0)
假设您要输出HTML表,则可以执行类似的操作。
$array= [
["time_spent"=> 10, "rate"=> 150],
["time_spent"=> 20, "rate"=> 100]
];
$html = [];
$sum = 0;
foreach ($array as $i => $row) {
$product = $row['rate'] * $row['time_spent'];
$line = "<tr><td>{$row['time_spent']}</td><td>{$row['rate]'}</td>";
$line .= "<td>{$row['time_spent']} x {$row['rate']} = {$product}</td>";
if ($i !== 0) {
$line .= '</tr>';
}
$html[] = $line;
$sum += $product;
}
$rowCount = count($html);
$html[0] .= "<td rowspan='{$rowCount}'>{$sum}</td></tr>";
echo '<table>' . implode('', $html) . '</table>';
编辑:更改了代码以反映输入的更改。
请注意,将有更好的方法来简单地计算总和。此方法通过一次循环遍历数据即可生成所需的显示以及总和。
答案 1 :(得分:0)
将 html 模板字符串与 s/printf()
一起使用在保持干净、可读的代码以及处理和标记之间的分离方面做得很好。
我故意使这个脚本变得冗长。这个脚本的优点是可读性和可维护性。
在表格的右列而不是表格的最后一行显示总计是一种不寻常的要求。如果您希望总数位于最后一行,那么代码会更容易编写和阅读(对于人类而言)。
在我的演示中,点击输出框右上角的眼睛图标可以查看结果的 html 渲染版本。
代码:(Demo)
$array = [
['time_spent' => 10, 'rate' => 150],
['time_spent' => 20, 'rate' => 100]
];
$tableMarkup = <<<'HTML'
<table>
%s
%s
</table>
HTML;
$headerRowMarkup = <<<'HTML'
<tr>
<th>Time Spent</th>
<th>Rate</th>
<th>Total</th>
<th>Grand Total</th>
</tr>
HTML;
$firstRowMarkup = <<<'HTML'
<tr>
<td>%1$d</td>
<td>%2$d</td>
<td>%1$d x %2$d = %3$d</td>
<td rowspan="%4$d">%5$d</td>
</tr>
HTML;
$subsequentRowMarkup = <<<'HTML'
<tr>
<td>%1$d</td>
<td>%2$d</td>
<td>%1$d x %2$d = %3$d</td>
</tr>
HTML;
$rowsMarkup = [];
$count = count($array);
if ($count) {
$grandTotal = array_reduce(
$array,
function ($carry, $row) {
$carry += $row['rate'] * $row['time_spent'];
return $carry;
},
0
);
$row = array_shift($array);
$rowsMarkup[] = sprintf(
$firstRowMarkup, // template string
$row['time_spent'], // %1$d
$row['rate'], // %2$d
$row['time_spent'] * $row['rate'], // %3$d
$count, // %4$d
$grandTotal // %5$d
);
}
foreach ($array as $row) {
$rowsMarkup[] = sprintf(
$subsequentRowMarkup,
$row['time_spent'],
$row['rate'],
$row['time_spent'] * $row['rate']
);
}
if ($rowsMarkup) {
printf(
$tableMarkup,
$headerRowMarkup,
implode("\n", $rowsMarkup)
);
}
答案 2 :(得分:-1)
在开始打印表格之前,您需要计算总计。然后,您可以在表格的第一行上显示它。
$grand_total = 0;
foreach ($array as $item) {
$grand_total += $item['rate'] * $item['time_spent'];
}
echo "<table>";
foreach ($array as $i => $item) {
$total = $row['time_spent'] * $row['rate'];
echo "<tr><td>{$row['time_spent']}</td><td>{$row['rate']}</td>";
if ($i == 0) { // first row, show grand total
echo "<td>$total</td><td>$grand_total</td>";
} else {
echo "<td colspan='2'>$total</td>";
}
echo "</tr>";
}
echo "</table>";