Php 合并列值相同的CSV行
我有一个大的CSV文件,大约有30列和2.5K行 除某些列外,某些行的值完全相同 我希望合并这些相似的列,并在不相同的列的值之间用逗号连接 小例子:Php 合并列值相同的CSV行,php,csv,Php,Csv,我有一个大的CSV文件,大约有30列和2.5K行 除某些列外,某些行的值完全相同 我希望合并这些相似的列,并在不相同的列的值之间用逗号连接 小例子: id name age kid 1 Tom 40 John 1 Tom 40 Roger ---merged becomes--- 1 Tom 40 John, Roger 我可以使用大量的for和ifs使用PHP来实现这一点,但我希望有一种更优雅、更快速的方法。对于一个常见的编程问题,这是一个很棒的初学
id name age kid
1 Tom 40 John
1 Tom 40 Roger
---merged becomes---
1 Tom 40 John, Roger
我可以使用大量的for和ifs使用PHP来实现这一点,但我希望有一种更优雅、更快速的方法。对于一个常见的编程问题,这是一个很棒的初学者问题。您需要做的是两步方法。首先,将CSV解析为可以轻松修改的数据结构,然后循环该结构并生成与输出匹配的新数组
<?php
// Parse CSV into rows like:
$rows = array(
array(
'id' => 1,
'name' => 'Tom',
'age' => 50,
'kid' => 'John'
),
array(
'id' => 1,
'name' => 'Tom',
'age' => 50,
'kid' => 'Roger'
),
array(
'id' => 2,
'name' => 'Pete',
'age' => 40,
'kid' => 'Pete Jr.'
),
);
// Array for output
$concatenated = array();
// Key to organize over
$sortKey = 'id';
// Key to concatenate
$concatenateKey = 'kid';
// Separator string
$separator = ', ';
foreach($rows as $row) {
// Guard against invalid rows
if (!isset($row[$sortKey]) || !isset($row[$concatenateKey])) {
continue;
}
// Current identifier
$identifier = $row[$sortKey];
if (!isset($concatenated[$identifier])) {
// If no matching row has been found yet, create a new item in the
// concatenated output array
$concatenated[$identifier] = $row;
} else {
// An array has already been set, append the concatenate value
$concatenated[$identifier][$concatenateKey] .= $separator . $row[$concatenateKey];
}
}
// Do something useful with the output
var_dump($concatenated);
如果您只有CSV文件中的数据,我认为最简单的方法是使用公共数据作为键构建关联数组,并在存在时对其进行修改:
$array=[];
while ($a=fgetcsv($handle)){
if (isset($array[$a[0]."-".$a[1]."-".$a[2]])) {
$array[$a[0]."-".$a[1]."-".$a[2]].=",".$a[3];
}
else {
$array[$a[0]."-".$a[1]."-".$a[2]]=$a[3];
}
}
请与我们分享您的尝试。@JayBlanchard请阅读我文章的最后一行。我阅读了最后一行,但它并没有展示您的尝试。您是否考虑过在查询中执行此操作?在查询中执行此操作将是我的最后一个选择,因为我获得了CSV,但无法访问数据库。没有什么可以尝试的,它只是csv中的一个foreach行,创建对象,比较文件中的值,将数据添加到对象的属性中,该属性与前面的属性不同,但主id相同。(我已经完成了存储数据的课程)感谢您的时间,但我发现另一个答案(naneau的答案)中的解决方案正是我完成这项工作所需要的。我不得不添加更多的连接键和条件,但效果很好。谢谢