PHP:遍历对象数组并在第一行中显示所有记录的总和

时间:2019-06-13 20:03:32

标签: php loops

假设我有以下数组:

$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是两个记录的总和)

3 个答案:

答案 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>";