【问题标题】:PHP put values from CSV file into an arrayPHP将CSV文件中的值放入数组
【发布时间】:2017-10-23 13:18:47
【问题描述】:

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

我做错了什么?

【问题讨论】:

  • 该值为布尔值,因为您将其设置为布尔值 (true)。您提供给 array_push 的不是数组,而是“真实”布尔值。而且我认为您不了解 array_push 的工作原理:它为数组的 end 添加了一个值。它不会影响数组 in 中的值。如果要将键/值对放入数组中,请使用 $array[$key] = $value。然后您可以使用该对来增加它(例如,$array[$key] += $value)。

标签: php arrays fopen fgetcsv array-push


【解决方案1】:

您可以尝试以下方法:

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

【讨论】:

  • 如果提供的解决方案有帮助。请务必接受。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      您将 $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
      }
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-03
          • 1970-01-01
          • 2018-11-13
          • 1970-01-01
          • 2019-03-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多