PHP将CSV文件中的值放入数组中

PHP将CSV文件中的值放入数组中,php,arrays,fopen,fgetcsv,array-push,Php,Arrays,Fopen,Fgetcsv,Array Push,我有一个有两列的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号都是一个数组,包含产品的数量。然后将数组中的值相加 然而,我正在努力将产品的数量放入ID阵列中。我

我有一个有两列的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号都是一个数组,包含产品的数量。然后将数组中的值相加

然而,我正在努力将产品的数量放入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


我做错了什么?

$unique[$row[0]]
在前面的行中设置为true。 如果我读得正确,这意味着如果
$row[0]
12345
,那么
$unique
数组的索引
12345
将填充
true


我想您可能想使用阵列而不是普通阵列?

您可以尝试以下方法:

$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];

您遇到的问题是,您的键是数字的,而数组希望是数字键而不是字母数字键。如果我面对这样的问题,我喜欢用这种方式作为一个快速而肮脏的解决方案。在循环中尝试此代码

$key = $row[0];
if (!array_key_exists("{$key}", $unique))
{
$unique["{$key}"] = $row[1];
}
else
{
$unique["{$key}"] += $row[1];
}

您正在将$unique[$row[0]]设置为上面这行的true

试试这个:

<?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);
然后,您可以使用以下内容将其写入CSV

foreach($data as $k => $v) {
  echo "$k,$v\n"; // Replace this with a file write obviously
}

你可以试试下面的例子来回答你的问题。首先检查数组键是否存在。如果键不存在,则将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);

如果提供的解决方案有帮助。请确保接受它。该值为布尔值,因为您将其设置为布尔值(true)。您提供给array\u push的不是数组,而是“true”布尔值。而且我认为您不了解array_push是如何工作的:它在数组的末尾添加了一个值。它不会影响数组中已有的值。如果要将键/值对放入数组,请使用$array[$key]=$value。然后您可以使用该对来增加它($array[$key]+=$value,例如)。
$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);
Array
(
    [12345] => 35
    [67890] => 10
)