【问题标题】:How to aggregate (sum) rows in a CSV file and print as a table using PHP如何聚合(汇总)CSV文件中的行并使用PHP打印为表格
【发布时间】:2014-12-10 06:25:54
【问题描述】:

我正在尝试使用 PHP 来解释一个简单的 CSV 日志文件并将其打印为表格。

该文件包含三列 - 一个名称,后跟两列,其中一个 1 或一个 0。

例如

Test,1,0
Test,0,1
Test2,1,0
Test3,1,0
Test3,0,1
Test3,1,0
Test3,0,1

我们的目标是将所有相同的行加起来得到:

Test,1,1
Test2,1,0
Test3,2,2

最后将其打印为 HTML 表格。

到目前为止,我有一个对前两列求和的有效解决方案,但我不知道如何让它工作以包含第三列。为了概述整个过程,我在网页开头有一个初始 PHP 脚本,用于记录对 CSV 文件的点击:

<?PHP
if (isset($_GET['s1'])){
$sub1 = urlencode($_GET['s1']);
$fp1 = fopen ('botlog.csv', 'a+' );
fputcsv ( $fp1, array ( $sub1, '1', '0' ), ",", '"' );
fclose ( $fp1 );}
?>

稍后我有第二个脚本,加载到带有 JS 延迟的 iFrame 中,它记录了类似的值,但记录到第三列而不是第二列:

<?PHP
if (isset($_GET['sub1'])){
$sub2 = urlencode($_GET['sub1']);
$fp2 = fopen ('botlog.csv', 'a+' );
fputcsv ( $fp2, array ( $sub2, '0', '1' ), ",", '"' );
fclose ( $fp2 );}
?>

然后,我有以下内容:a) 聚合第二列值的行(还没有弄清楚如何做第三列)并放入数组中,b) 将其全部转储为表:

<?php
$array = array_map('str_getcsv', file('botlog.csv'));
$inputfile  = 'botlog.csv';
$inputHandle = fopen($inputfile, "r");
$sumArray = array();
while (($dataRow = fgetcsv($inputHandle, 1000, ",")) !== FALSE) {
    $subid = $dataRow[0];
    $extra1 =  $dataRow[2];
    if (!isset($sumArray[$subid])) {
        $sumArray[$subid] = 0;
    }
 $sumArray[$subid] += $extra1;
}

var_dump($sumArray); //test sum works

function build_table($sumArray){
    // start table
    $html = '<table>';
    // header row
    $html .= '<tr>';
    $header=array("SUBID"=>"1","Initial Clicks"=>"2","Secondary Clicks"=>"3", "Percentage"=>"4");
    foreach($header as $key=>$value){
            $html .= '<th>' . $key . '</th>';
        }
    $html .= '</tr>';
    // data rows
    foreach( $sumArray as $key=>$value){
        $html .= '<tr>';
        foreach($value as $key2=>$value2){
            $html .= '<td>' . $value2 . '</td>';
        }
        $html .= '</tr>';
    }
    // finish table and return it
    $html .= '</table>';
    return $html;
}
echo build_table($array);
?>

初始代码的工作原理是它创建了一个数组,其中第 2 列的值相加。哇!但是,然后我尝试在这个 sumArray 上使用 HTML 表格打印出来,但它只显示原始内容(即不是从 while 函数生成的内容。

所以,目标:

  1. 修改初始代码块以创建一个 $sumArray,它合并所有相同的第 1 列行,但添加它们的第 2 列和第 3 列值。

  2. 将其打印在一个漂亮的表格中,并带有第 4 个备用列。

帮助非常感谢!

编辑:这是我使用的最终工作代码:

<?php
if (file_exists('botlog.csv')) {
$array = array_map('str_getcsv', file('botlog.csv'));
$inputfile  = 'botlog.csv';
$inputHandle = fopen($inputfile, "r");
$sumArray = array();
while (($dataRow = fgetcsv($inputHandle, 1000, ",")) !== FALSE) {
    $subid = $dataRow[0];
    if (!isset($sumArray[$subid])) {
        $sumArray[$subid] = array_fill(0, count($dataRow)-1, 0);
    }
    for ($i = 1; $i < count($dataRow); $i++) {
    $sumArray[$subid][$i-1] += $dataRow[$i];
}}

arsort($sumArray);
$table = $sumArray;

echo '<table>';
echo "<thead><td><span>Subid</span></td><td><span>Initial Clicks</span></td><td><span>Secondary Clicks</span></td><td><span>Percentage</span></td></thead>";

foreach ($table as $subids => $values)
{
    echo "<tr><td>".$subids."\n";
    echo "<td>" . $values['0'] . "</td>";
    echo "<td>" . $values['1'] . "</td>";
    echo "<td>Final column contents</td>";
}   

echo "</table>";
}
else{ echo "Botlog.csv file was not found in current directory";}
?>

【问题讨论】:

    标签: php csv aggregate


    【解决方案1】:

    $sumArray 设为二维数组。第一个维度的key是CSV的第一列,第二个维度是其余列的总和。

    while (($dataRow = fgetcsv($inputHandle, 1000, ",")) !== FALSE) {
        $subid = $dataRow[0];
        if (!isset($sumArray[$subid])) {
            $sumArray[$subid] = array_fill(0, count($dataRow)-1, 0);
        }
        for ($i = 1; $i < count($dataRow); $i++) {
        $sumArray[$subid][$i-1] += $dataRow[$i];
    }
    

    【讨论】:

    • 谢谢!那就是它聚合成一个数组。但是,现在如何将其打印为表格? stackoverflow.com/questions/10571346/… 看起来很理想,但我当前的 2D 数组有点不同,它只打印 3 列中的 2 列。
    • 它只需要简单的嵌套循环,有什么问题?
    • 我只是一个 JS 菜鸟 :P 但我确实设法为它整理了嵌套循环并让它全部工作。感谢您的帮助!
    • 这是 PHP,不是 JS。但是循环在大多数语言中是相似的,用于处理二维数据的嵌套循环是一个基本的编程概念。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 2017-04-21
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    相关资源
    最近更新 更多