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

时间:2017-10-23 13:18:47

标签: 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数组中。我目前正在使用它来创建数组:

$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。

我做错了什么?

5 个答案:

答案 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
)

然后您可以使用类似

的内容写入CSV
foreach($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
)