media_gallery_image category sku created_at price
/c/u/cutting_shafts.jpg Specials 01mb 3/19/2013 22:59 1487
/s/h/shred_bin_3.jpg Cross Cut
/e/c/ecc_switch_3.jpg Destroyit
/2/6/2604ccm.jpg Commercial
Paper Phoenix
这些是CSV文件中一个产品的详细信息。对于这个产品,它向我展示了sku,创建日期,价格和多个类别&画廊图片。
现在的问题是它显示第一个媒体库图像,第一类,sku为01mb,日期为2013年3月19日22:59,价格为1487一行,
然后在第二行它显示第二个图库图像,第二个类别,sku为空白,日期为空白,价格为空白
然后在第3行(与第2行相同),依此类推。
我有这样的100种产品,它们都有多个图像,类别但没有显示在与上面相同的产品数据行中。我想合并所有媒体库图像在同一行和相同的列中用逗号(,)分隔。例如 "/c/u/cutting_shafts.jpg, /s/h/shred_bin_3.jpg, /e/c/ecc_switch_3.jpg, /2/6/2604ccm.jpg"
和类别列相同。
是否可以通过php编辑和更新CSV来实现这一目标?
以下是所需内容的屏幕截图: -
答案 0 :(得分:0)
以下执行与group by类似的操作,并在指定为参数的列上合并。它可能用于做你想做的事情:
<?php
function setup_row($groups, $row){
$res = $row;
array_map(function($v) use(&$res,$row){
$res[$v] = array($row[$v]);
},$groups);
return $res;
}
function concat_row($groups, $coalesces, $row, &$merge){
array_map(function($v) use ($row, &$merge) {
if (isset($row[$v]) && $row[$v] != "")
$merge[$v][] = $row[$v]; // add to group concat columns
},$groups);
array_map(function($v) use ($row, &$merge) {
if (isset($row[$v]) && $row[$v] != "")
$merge[$v] = $row[$v]; // coalesce columns
},$coalesces);
}
function implode_row($groups, $merge){
array_map(function($v) use (&$merge) {
$merge[$v] = implode(',', $merge[$v]);
},$groups);
return $merge;
}
function csv_group_by($groups, $coalesces, $group_by, $infile, $outfile){
$current_group = "";
$result;
if (($hin = fopen($infile, "r")) !== FALSE &&
($hout = fopen($outfile, "w")) !== FALSE) {
while (($row = fgetcsv($hin, 0, ",")) !== FALSE) {
if ($row[$group_by] != $current_group){
if (isset($merge)){
$result = implode_row($groups, $merge);
fputcsv($hout, $result,',');
}
$merge = setup_row($groups, $row);
} else {
concat_row($groups, $coalesces, $row, $merge);
}
}
if (isset($merge)){
$result = implode_row($groups, $merge);
fputcsv($hout, $result,',');
}
fclose($hin);
fclose($hout);
}
}
csv_group_by(array(1,2), array(), array(5),”infile”,"outfile");
?>
将outfile
和outfile
替换为您在最后一行中所需的文件名。
或者用
之后的函数替换脚本的结尾If (count($argv) == 3)
csv_group_by(array(1,2), array(), array(5),$argv[1],$argv[2]);
?>
并在命令行中调用脚本,如下所示:
$ php script.php <infile> <outfile>
<infile>
和<outfile>
具有预期含义。
哦,脚本希望csv文件以逗号分隔,你必须编辑代码才能改变这种行为。