Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 合并列值相同的CSV行_Php_Csv - Fatal编程技术网

Php 合并列值相同的CSV行

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来实现这一点,但我希望有一种更优雅、更快速的方法。对于一个常见的编程问题,这是一个很棒的初学

我有一个大的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来实现这一点,但我希望有一种更优雅、更快速的方法。

对于一个常见的编程问题,这是一个很棒的初学者问题。您需要做的是两步方法。首先,将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的答案)中的解决方案正是我完成这项工作所需要的。我不得不添加更多的连接键和条件,但效果很好。谢谢