根据导入的CSV文件中的列将行分组在一起

时间:2014-09-16 20:15:33

标签: php csv

我有一个CSV文件,里面有很多行,如下所示:

客户产品数量单位金额总计 1 Prod1 1 10 10 1 Prod2 2 15 30 2 Prod1 2 12 24 2 Prod2 1 5 5

等...

我希望能够使用PHP导入CSV文件并将每个客户端组合在一起,并显示每个客户端的总成本。

我有我的导入功能等......

if(is_uploaded_file($_FILES['file']['tmp_name'])) {
    echo "<h3>" . "File ". $_FILES['file']['name'] ." uploaded successfully." . "</h3><br><br>";
}

$handle = fopen($_FILES['file']['tmp_name'], "r");
fgetcsv($handle);

//then loop through each row
while(($data = fgetcsv($handle, 1000, ",")) !== FALSE) {

}

但我不确定在while循环中做什么

如果可能的话,我想在不使用数据库的情况下这样做

2 个答案:

答案 0 :(得分:0)

$clients = array();
while(($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
     if(!array_key_exists($data[0],$clients))
         $clients[$data[0]] = array();
      array_push($clients[$data[0]],$data);
}


//then loop over each client in your array
foreach($clients as $clientId => $clientEntries)
{
// combine or print records...
}

答案 1 :(得分:0)

因此,循环中的任务是获取$ data提供的数组并将其转换为可用数组,该数组使用客户端ID作为键,总成本作为值。我的实施如下:

$customerTotals = array();

while ($data = fgetcsv($handle, 1000, ',')) {
  $currentTotal = isset($customerTotals[$data[0]]) ? intval($customerTotals[$data[0]]) : 0;

  $addedTotal = intval($data[2]) * intval($data[4]);

  $customerTotals[$data[0]] = $currentTotal + $addedTotal;
}

请注意,上述代码不进行任何健全性检查。空行或缺少列会导致意外错误。它将第一列(客户ID)作为数组键,将第3列和第5列分别放在一起,数量和价格。

您现在可以像这样迭代这个数组:

foreach ($customerTotals as $customerId => $total) {}