Как агрегировать (суммировать) строки в файле CSV и печатать в виде таблицы, используя переполнение стека

Я пытаюсь использовать 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 );}
?>

Позже у меня есть второй сценарий, загруженный в iFrame с задержкой JS, который записывает аналогичное значение, но в третий столбец, а не во второй:

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

Затем у меня есть следующее: а) собрать строки для значения 2-го столбца (тоже не выяснил, как сделать третий) и поместить в массив; б) вывести все это в виде таблицы:

<?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. Woot! Тем не менее, я затем пытаюсь использовать HTML-таблицу, распечатанную на этом sumArray, но он просто отображает исходное содержимое (т.е. не сгенерированное из функции 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";}
?>

0

Решение

Делать $sumArray 2-мерный массив. Ключом первого измерения является первый столбец 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];
}
1

Другие решения

Других решений пока нет …