首页 > 解决方案 > PHP & CSV - 只回显一次结果

问题描述

我对 PHP 相当陌生,并尝试了几个小时来完成某些事情,遗憾的是没有结果。我希望你能指出我正确的方向。

所以我得到的是一个包含文章的 CSV 文件。它们被分成不同的列并且总是相同的结构,例如:

ArtNo, ArtName, ColorCode, Color, Size

当一篇文章在 CSV 中有不同的颜色代码时,除了颜色代码之外,文章只是用相同的信息重复,请看一个例​​子:

ABC237;Fingal Edition;48U;Nautical Blue;S - 5XL;
ABC237;Fingal Edition;540;Navy;S - 5XL;

我的问题是,我想在表格中显示所有文章,包括文章图像等。到目前为止,我得到的工作不是问题,而是为我想要创建的每个不同颜色代码显示文章两次每个 ArtNo(第一个 CSV 行)只有一行,但仍读取第二个重复行以将文章颜色添加到第一行,例如:

ABC237; Fingal Edition ;540;Nautical Blue, Navy;S - 5XL;

这甚至可能吗,还是我在这里走向完全错误的方向?我的代码看起来像这样

    <?php
    $csv = readCSV('filename.csv');
    
    foreach ($csv as $c) {
    
    $artNo = $c[0]; $artName = $c[1]; $colorCode = $c[2]; $color = $c[3]; $sizes = $c[4]; $catalogue = $c[5]; $GEP = $c[6]; $UVP = $c[7]; $flyerPrice = $c[8]; $artDesc = $c[9]; $size1 = $c[10]; $size2 = $c[11]; $size3 = $c[12]; $size4 = $c[13]; $size5 = $c[14]; $size6 = $c[15]; $size7 = $c[16]; $size8 = $c[17]; $picture = $c[0] . "-" . $c[2] . "-d.jpg";
        
    // Echo HTML Stuff
    }
?>

读取 CSV 函数

<?php
function readCSV($csvFile){
    $file_handle = fopen($csvFile, 'r');
        while (!feof($file_handle) ) 
        {
            $line_of_text[] = fgetcsv($file_handle, 0, ";");
        }
    fclose($file_handle);
    return $line_of_text;

} ?>

我试图与 array_unique 等相处,但找不到合适的解决方案。

标签: phpcsv

解决方案


您需要确切知道每个 ArtNo 组有多少项目。这意味着要分组的循环和要显示的另一个循环。

分组时,我从数据行中窃取ArtNo并将其用作分组键。该行中的剩余数据将是该组/ArtNo 的索引子数组。

我将向您展示一些语法printf()sprintf()保持清洁。 printf()将显示第一个参数的内容并使用任何后续值替换字符串中的占位符。在这种情况下,第二个参数是条件表达式。在组的第一次迭代 ( $i = 0) 中,我们希望将 ArtNo 显示为行的第一个单元格,并声明它应该跨越的行数。 sprinf()就像printf()除了它产生一个值(默默地)。在该组的任何后续迭代中,$i将大于零,因此将一个空字符串作为值传递。

implode()接下来,当您不知道表将有多少列(或者列数在项目的生命周期中可能会发生变化)时,我将使用它非常灵活。

测试代码:

$csv = <<<CSV
ABC237;Fingal Edition;48U;Nautical Blue;S - 5XL
ABC236;Fingal Edition;540;Navy;S - 5XL
ABC237;Fingal Edition;49U;Sea Foam;L - XL
ABC237;Fingal Edition;540;Navy;S - 5XL
CSV;

$lines = explode(PHP_EOL, $csv);
foreach ($lines as $line) {
    $row = str_getcsv($line, ';');
    $grouped[array_shift($row)][] = $row;
}

echo '<table>';
foreach ($grouped as $artNo => $group) {
    foreach ($group as $i => $values) {
        printf(
            '<tr>%s<td>%s</td></tr>',
            (!$i ? sprintf('<td rowspan="%s">%s</td>', count($group), $artNo) : ''),
            implode('</td><td>', $values)
        );
    }
}
echo '</table>';

输出:

在此处输入图像描述


推荐阅读