cakephp 如何格式化html表格以显示唯一的月份和项目ID并汇总成本?(PHP)

iyr7buue  于 2022-11-11  发布在  PHP
关注(0)|答案(3)|浏览(145)

我已经被这个“小”问题困了好几天了。我有一个包含特定数据的数组:

$data = array(
0 => array('id' => 8, 'month' => 1, 'cost' => 12500),
1 => array('id' => 8, 'month' => 2, 'cost' => 14200),
2 => array('id' => 9, 'month' => 1, 'cost' => 23000),
3 => array('id' => 9, 'month' => 2, 'cost' => 18000),
);

这是我需要得到的html表结果:

Id     Jan      Feb      Mar     Apr        May
 8    12,500  14,200  10,200   10,300     11,000
 9    23,000  18,000  21,320   10,642     14,636

我如何排序数组以在view.ctp的html表中显示这些数据?我已经尝试过使用foreach循环,但我真的不知道如何像上面显示的那样放置唯一月份和唯一ID。我使用的是CakePHP 2.x技术。
我很感激你的帮助谢谢

u7up0aaq

u7up0aaq1#

循环数组并根据ID分组到新数组中。使用ID作为多维数组的分组键,分配month=cost键-值对。

$by_id = [];

foreach($data as $x) {
    $by_id[$x['id']][$x['month']] = $x['cost'];
    // e.g. $by_id[8][2] = 14200;
}

这会将示例数据转换为以下数组:

array(2) {
    [8] · array(2) {
        [1] · int(12500)
        [2] · int(14200)
    }
    [9] · array(2) {
        [1] · int(23000)
        [2] · int(18000)
    }
}

这应该更容易转换成HTML表格。例如:

$html = [];
$html[] = '<table>';
$html[] = '<tr><th>ID</th><th>Jan</th><th>Feb</th></tr>';

foreach($by_id as $id => $months) {
    $html[] = '<tr>';
    $html[] = "<td>{$id}</td>";

    foreach($months as $month => $cost) {
        $html[] = "<td>{$cost}</td>";
    }

    $html[] = '</tr>';
}

$html[] = '</table>';

echo implode("\n", $html);

我相信代码足够清晰,没有复杂的注解。根据需要在表头中添加月份。例如,使用number_format for $cost来格式化您的货币。* 请注意,上面的示例代码没有考虑给定ID可能缺少的月份 *,它假设数据对称。如果需要,添加检查和补救措施。请参见https://3v4l.org/7CFRf上的演示。

mctunoxg

mctunoxg2#

您应该使用2D数组来显示这种表格。
那么$data数组可能是这样的:

$data = array(
    0 => array('id' => 8, 'costData' => array(
        0 => array('month' => 1, 'cost' => 12500),
        1 => array('monnt' => 2, 'cost' => 14200)
    ),
    1 => array('id' => 9, 'costData' => array(
        0 => array('month' => 1, 'cost' => 23000),
        1 => array('month' => 2, 'cost' => 18000)
    )
);

要像这样还原$data数组,需要下面的代码。

<?php
$newData = array();
for($i = 0; $i < count($data); $i++)
{
    $newItem = array('id' => $data[$i]['id'], 'costData' => array(
        'month' => $data[$i]['month'],
        'cost' => $data[$i]['cost']
    ));
    for($j = $i + 1; $j < count($data); $j++)
    {
        if($data[$j]['id'] == $data[$i]['id']) {
            $newItem['costData'][] = array('month' => $data[$j]['month'], 'cost' => $data[$j]['cost']);
            array_splice($data, $j, 1);
            $j--;
        }
    }
    $newData[] = $newItem;
}

使用new data Array,你可以让你的html页面像这样。

$html = '';
for($i = 0; $i < count($newData); $i++)
{
    $html .= '<tr>';
    $html .= '<td>'.($newData[$i]['id']).'</td>';
    for($j = 0; $j < count($newData[$i]['costData']); $j++) {
        $html .= '<td>'.($newData[$i]['costData'][$j]).'</td>';
        // you can do some operations if there are missing months to leave blank td tags..
    }
    // fill the missing months to fill the td tags.
}
7xllpg7q

7xllpg7q3#

您可以使用array_column()和array_sum()函数的组合:
$数据=数组(
数组(“id”=〉8,“月份”=〉1,“成本”=〉12500),
数组(“id”=〉8,“月份”=〉2,“成本”=〉14200),
数组(“id”=〉9,“月份”=〉1,“成本”=〉23000),
数组(“id”=〉9,“月份”=〉2,“成本”=〉18000),
);
数组()中的每个元素。
foreach($数据作为$行){
$结果[$行['标识']][$行['月份']] = $行['成本'];
}
//将每个月的成本加总
$months =数组列($data,'月份');
$result =数组Map(函数($v)使用($months){
返回数组和(数组交叉键($v,数组翻转($months)));
}、$结果);
打印_r($结果);
这将输出:
数组

[8]=〉数组

[1]=〉12500
[2]=〉14200

[9]=〉数组

[1]=〉23000
[2]=〉18000

相关问题