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