在 PHP 中组合 csv 列值

Posted

技术标签:

【中文标题】在 PHP 中组合 csv 列值【英文标题】:Combine csv column values in PHP 【发布时间】:2016-10-17 06:00:40 【问题描述】:

我有一个 5 行的 csv 文件:

id | price|   name  | sku  | qty
1  |  22  | widget0 | abcd | 1
2  |  21  | widget1 | efgh | 1
3  |  10  | widget0 | abcd | 2
4  |  44  | widget1 | efgh | 1
5  |  22  | widget4 | mnop | 1

等等... 前 3 列仅用于视觉目的,不用于我需要实现的目标。 我需要做的是读取文件中的sku和qty数据并输出结果。 我必须计算相同 sku 的数量并获得每个 sku 的总数量。

根据上面的例子,我需要:

sku  | qty
abcd | 3
efgh | 2
ijkl | 1
mnop | 1

通过以下代码,我可以得到文件中相同sku的总数:

$file = ('my.csv');
$fh = fopen($file, 'rb');
$tag = array();
$qty = array();
$row=1;
while($col = fgetcsv($fh)) 
if($row == 1) $row++; continue;  //skip 1st row
$num = count($fh);
if (isset($tag[$col[3]])) 
$tag[$col[3]]++;

else 
$tag[$col[3]] = 1;


print_r($tag);

它给了我:

sku  | qty
abcd | 2
efgh | 2
ijkl | 1
mnop | 1

这是不正确的。我不知道如何获取 qty 列值并将其与 csv 文件中的 skus 值的总数相关联。 有什么想法吗?

【问题讨论】:

【参考方案1】:

为您的解决方案使用以下代码

$file = ('my.csv');
$fh = fopen($file, 'rb');
$tag = array();
$qty = array();
$row=1;
while($col = fgetcsv($fh)) 
if($row == 1) $row++; continue;  //skip 1st row
$num = count($fh);
if (isset($tag[$col[3]])) 
//$tag[$col[3]]++;
$tag[$col[3]] = (int)$tag[$col[3]] + (int)$col[4]; // where $col[4] = qty with forcing to `int` value

else 
$tag[$col[3]] = $col[4];


print_r($tag);

你需要做数量的总和,而不是增加+1

希望这会有所帮助!

【讨论】:

厕所。请投票并接受答案,以便其他用户使用它。 :)【参考方案2】:

试试这个解决方案

$file = ('my.csv');
$fh = fopen($file, 'rb');
$tag = array();
$qty = array();
$row=1;

//skip first row
fgetcsv($fh, 10000, ",");

while($col = fgetcsv($fh,10000)) 

$num = count($fh);
if (isset($tag[$col[3]])) 
$tag[$col[3]]++;

else 
$tag[$col[3]] = 1;


print_r($tag);

【讨论】:

以上是关于在 PHP 中组合 csv 列值的主要内容,如果未能解决你的问题,请参考以下文章

根据列值将 SQL 结果组合成组

SQL中基于Common ID的列值组合

熊猫将具有相同索引的一列值组合到列表中[重复]

ExtJS 4 - 当列编辑器是组合框时如何避免网格列值变为空?

C++ - 为啥 boost::hash_combine 是组合散列值的最佳方式?

Pandas - 将列值组合到新列中的列表中