我有一个包含两列的CSV文件。第一个是ID号,第二个是具有该ID的产品数。 CSV可以有多个相同ID的副本,我需要做的是合并它们并为每个ID添加产品数量。
CSV看起来像这样:
12345,10
12345,5
12345,20
67890,1
67890,7
67890,2
我需要它变成:
12345,35
67890,10
我想出这样做的方法是创建一个多维数组,其中包含一个包含ID号的整体数组,每个数组都是一个包含产品数的数组。然后在数组中添加这些值。
但我很难将产品数量放入ID数组中。我目前正在使用它来创建数组:
$unique = array();
$file = fopen('test.csv', 'r');
while($row = fgetcsv($file, 0, ',', '\\')) {
$unique[$row[0]] = true;
array_push($unique[$row[0]], $row[1]);
}
$ row [0]作为唯一值添加到数组中,但是当我尝试将$ row [1]推入ID数组时,我得到一个错误,指出该值是布尔值而不是数组,因为某些原因当我尝试在数组推送中使用它时,$ row [0]变为'1'而不是ID。
我做错了什么?
答案 0 :(得分:2)
您可以尝试以下操作:
$unique = array();
$file = fopen('test.csv', 'r');
while($row = fgetcsv($file, 0, ',', '\\')) {
$unique[$row[0]][] = $row[1];
}
var_dump($unique);
这将提供如下输出:
12345 =>
array (size=3)
0 => string ' 10 ' (length=4)
1 => string ' 5 ' (length=3)
2 => string ' 20 ' (length=4)
67890 =>
array (size=3)
0 => string ' 1 ' (length=3)
1 => string ' 7 ' (length=3)
2 => string ' 2' (length=2)
编辑:如果您还需要$row[1]
的总和,可以在循环中尝试以下内容:
$unique[$row[0]] = !isset($unique[$row[0]]) ? (int)$row[1] : $unique[$row[0]] + (int)$row[1];
答案 1 :(得分:1)
$unique[$row[0]]
在之前的行中设置为true。
如果我正确阅读,则表示如果$row[0]
为12345
,$unique
数组的索引12345
将填充true
。
我想您可能想要使用Multidimensional array而不是普通数组?
答案 2 :(得分:0)
您遇到的问题是您的密钥是数字,而数组希望是数字而不是字母数字键。如果我遇到这种问题,我喜欢把它作为一种快速而肮脏的解决方案。在你的循环中试试这段代码。
$key = $row[0];
if (!array_key_exists("{$key}", $unique))
{
$unique["{$key}"] = $row[1];
}
else
{
$unique["{$key}"] += $row[1];
}
答案 3 :(得分:0)
您将$ unique [$ row [0]]设置为上面的行。
试试这个:
<?php
$data = [];
$file = fopen('test.csv', 'r');
while($row = fgetcsv($file, 0, ',', '\\')) {
$value = isset($data[$row[0]]) ? $data[$row[0]] : 0;
$value += $row[1];
$data[$row[0]] = $value;
}
print_r($data);
这会在我的机器上打印以下内容:
Array
(
[12345] => 35
[67890] => 10
)
然后您可以使用类似
的内容写入CSVforeach($data as $k => $v) {
echo "$k,$v\n"; // Replace this with a file write obviously
}
答案 4 :(得分:0)
您可以尝试以下示例来解决您的问题。首先检查数组键是否存在。如果key不存在,则将0分配给该密钥,然后将该密钥的总和置于密钥存在条件下。
$unique = array();
$file = fopen('test.csv', 'r');
while ($row = fgetcsv($file, 0, ',', '\\')) {
if (!array_key_exists($row[0], $unique)) {
$unique[$row[0]] = 0;
}
$unique[$row[0]] += $row[1];
}
echo "<pre>";
print_r($unique);
$unique[$row[0]] += $row[1];
此行将为您提供唯一索引和的索引。
以上是上述代码。
Array
(
[12345] => 35
[67890] => 10
)