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

PHP put values from CSV file into an array

我有一个包含两列的 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。

我做错了什么?

$unique[$row[0]] 在前一行中设置为 true。 如果我没看错的话,这意味着如果 $row[0]12345$unique 数组的索引 12345 将填充 true.

我想您可能想使用 Multidimensional array 而不是普通数组?

您可以尝试以下方法:

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

这会在我的机器上打印以下内容:

Array
(
  [12345] => 35
  [67890] => 10
)

然后您可以将其写入 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);

$unique[$row[0]] += $row[1]; 此行将为您提供唯一索引和唯一索引之和。

这是上面代码的输出。

Array
(
    [12345] => 35
    [67890] => 10
)