代码之家  ›  专栏  ›  技术社区  ›  Edward144

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

  •  2
  • Edward144  · 技术社区  · 7 年前

    我有一个包含两列的CSV文件。第一个是ID号,第二个是具有该ID的产品数量。CSV可以具有相同ID的多个副本,我需要做的是将这些副本合并,并将每个ID的产品数量添加到一起。

    12345, 10
    12345, 5

    67890, 1
    67890, 7

    我需要它变成:

    12345, 35
    67890, 10

    然而,我正在努力将产品的数量放入ID阵列。我目前正在使用它创建阵列:

    $unique = array();
    $file = fopen('test.csv', 'r');
    
    while($row = fgetcsv($file, 0, ',', '\\')) {
        $unique[$row[0]] = true;
        array_push($unique[$row[0]], $row[1]);
    }
    

    我做错了什么?

    5 回复  |  直到 7 年前
        1
  •  2
  •   mega6382    7 年前

    您可以尝试以下操作:

    $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
  •  1
  •   mega6382    7 年前

    $unique[$row[0]] 如果我读对了,这意味着如果 $row[0] 12345 $unique 数组将具有索引 12345 充满 true .

    我想你可能想用一个 Multidimensional array 而不是普通阵列?

        3
  •  0
  •   Odyssey1111    7 年前

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

    $key = $row[0];
    if (!array_key_exists("{$key}", $unique))
    {
    $unique["{$key}"] = $row[1];
    }
    else
    {
    $unique["{$key}"] += $row[1];
    }
    
        4
  •  0
  •   Alcinator    7 年前

    试试这个:

    <?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
  •   Pankaj Makwana itbirds    7 年前

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