PHP:当特定值相等时对 csv 行进行分组 [closed]

PHP: Grouping csv lines when a specific value is equal [closed]

提问人:fmineo 提问时间:3/14/2015 最后编辑:fmineo 更新时间:3/14/2015 访问量:410

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将有助于其他人回答这个问题。

8年前关闭。

不要以为这很难,但经过一天的辛苦工作,我无法解决这个微不足道的问题。 我有一个简单的csv文件,我必须通过php显示,从列的值对行进行分组。 我们具体去:

这是我的CSV文件:

15000,art1,black
15000,art1,white
15000,art1,green
20000,art2,black
20000,art2,white
25000,art3,black

这就是我想打印的内容:

15000-art1-black
15000-art1-white
15000-art1-green
--- Found black,white,green ---
20000-art2-black
20000-art2-white
--- Found balck,white ---
25000-art3-black
--- Found black ---

我的出发点是这样的:

<?php
$Export= fopen("Test.csv", "r");
while(!feof ($Export)){
    $riga=fgets($Export, 4096);
    if($riga!=""){
        $data=split(',',$riga);
        foreach ($data as $line) {
            $val = explode(",", $line); 
            $code       =   $val[0];
            $art_n      =   $val[1];
            $color      =   $val[2];
        }
    }
}
fclose($Export);
?>
php 数组 csv foreach feof

评论

0赞 unixmiah 3/14/2015
把你的整个来源。您需要首先将每个换行符放入一个数组中,然后分解逗号,然后将其替换为 - 最后计算出现次数以正确显示---找到。
0赞 fmineo 3/14/2015
你能给我举个例子吗?

答:

0赞 bladerz 3/14/2015 #1

这是你的 php 代码的修改版本,可以做你想做的事:

<?php
$Export= fopen("Test.csv", "r");
$found=array();
$lastart="";
while(!feof ($Export)){
    $riga=fgets($Export, 4096);
    $riga = str_replace(PHP_EOL, '', $riga);
    if($riga!=""){
            $val = explode(",", $riga);
            $code       =   $val[0];
            $art_n      =   $val[1];
            if ( $lastart != $art_n && $lastart != "") {
                    foreach ( $found as $col ) {
                            @$colorfound.=$col.",";
                    }
                    $colorfound = rtrim($colorfound, ",");
                    echo "--- Found $colorfound ---\n";
                    unset ($found);
                    $colorfound = "";
            }
            $color      =   $val[2];
            $found[]    =   $color;
            echo "$code-$art_n-$color\n";
            $lastart  =   $art_n;
    }
}
//The last art_n
foreach ( $found as $col ) {
        @$colorfound.=$col.",";
}
$colorfound = rtrim($colorfound, ",");
echo "--- Found $colorfound ---\n";
fclose($Export);
?>
1赞 robbmj 3/14/2015 #2
<?php 

if (($handle = fopen("Test.csv", "r"))) {
    $lines = array();
    while (($columns = fgetcsv($handle))) {

        $number = $columns[0];
        $colour = $columns[2];

        if (!isset($lines[$number])) {
            $lines[$number] = array('instances' => array(), 'colours' => array());
        }

        $lines[$number]['instances'][] = $columns;
        $lines[$number]['colours'][$colour] = 1;
    }

    fclose($handle);

    foreach ($lines as $number => $line) {
        foreach ($line['instances'] as $instance) {
            echo implode('-', $instance) . "\n";
        }
        echo "--- Found " . implode(',', array_keys($line['colours'])) . " ---\n";
    }
}

输出:

15000-art1-black
15000-art1-white
15000-art1-green
--- Found black,white,green ---
20000-art2-black
20000-art2-white
--- Found black,white ---
25000-art3-black
--- Found black ---