将csv行中的数据按一列分组,并在每组中的其他列中创建以逗号分隔的值



我有一个旧的脚本,我想改造的人,但不幸的是,我不是在PHP经验丰富。它所做的是,它将文章信息从CSV文件读取到数组中,然后基本上将输出发布到HTML表中,然后可以保存到PDF文件中。

有一件事我不太明白,文件为一篇文章提供了重复的行,而只有一些值改变了(大小,颜色等)。文章确实具有相同的名称,但在输出中没有重复两次,即"new"值只是添加到已经存在的记录,我很不确定如何做到这一点。让我给你一个简单的例子:

CSV例子:

ArtNo、名称、颜色、大小

DEF270, Fingal, Stellar, 3XL

DEF270,银色,白色,4XL;

那么,在一个常规循环中,输出应该是这样的

<表类>ArtNo名称颜色大小tbody><<tr>DEF270芬戈尔的3 xlDEF270芬戈尔白色4 xl

让您将数据从CSV加载到普通数组。在此之后,您可以以以下方式应用array_reduce:

$res = array_reduce(
$rows,
function($res, $row) {
if (isset($res[$row[0]])) {
$res[$row[0]][1] .= ", $row[1]";
$res[$row[0]][2] .= ", $row[2]";
$res[$row[0]][3] .= ", $row[3]";
}
else $res[$row[0]] = $row;
return $res;
},
[]
);
var_export($res);

PHPize -在线运行php代码

可以通过对文章编号进行分组并将属性添加到每个数组来处理整个文件。在输出时,将它们用逗号分隔。

$csv = <<<'_CSV'
ArtNo,Name,Color,Size
DEF270, Fingal, Stellar, 3XL
DEF270, Fingal, White, 4XL;
_CSV;
$csv_handle = fopen('php://memory', 'rw');
$fwrite     = fwrite($csv_handle, $csv);
fseek($csv_handle, 0);
$articles = [];
while (($data = fgetcsv($csv_handle)) !== false) {
[$articleNumber, $name, $color, $size] = array_map('trim', $data);
if (!isset($articles[$articleNumber])) {
$articles[$articleNumber] = [
'names'  => [$name],
'colors' => [$color],
'sizes'  => [$size],
];
continue;
}
$article = &$articles[$articleNumber];
if (!in_array($name, $article['names'])) {
$article['names'][] = $name;
}
if (!in_array($color, $article['colors'])) {
$article['colors'][] = $color;
}
if (!in_array($size, $article['sizes'])) {
$article['sizes'][] = $size;
}
unset ($article);
}
fclose($csv_handle);
echo "<table>n";
foreach ($articles as $articleNumber => $article) {
$names  = implode(', ', $article['names']);
$colors = implode(', ', $article['colors']);
$sizes  = implode(', ', $article['sizes']);
echo "<tr><td>$articleNumber</td><td>$names</td><td>$colors</td><td>$sizes</tr>n";
}
echo "</table>n";

输出
<table>
<tr><td>ArtNo</td><td>Name</td><td>Color</td><td>Size</tr>
<tr><td>DEF270</td><td>Fingal</td><td>Stellar, White</td><td>3XL, 4XL;</tr>
</table>

相关内容

  • 没有找到相关文章

最新更新