0

这段代码有效,但我只是利用我对 PHP 的有限知识将其破解,我确信有一种更优雅、更有效的方法来处理它。如果你能指出我如何改进,那就太好了!

所以我有一个 CSV 文件,结构如下:

Code        Class     Value    Status      Date Created    Date Redeemed
========================================================================
a51f3g45    gold      50       valid       2012-08-20      
4f6a2984    silver    200      redeemed    2012-08-23      2012-08-27      
gf3eb54b    gold      150      valid       2012-08-30      

etc...

用户填写表格以更改给定行的ClassValueStatus字段。我拼凑了以下代码以用新值替换旧值:

$file = 'codes.csv';
$old_csv_string = file_get_contents($file);

preg_match('/('.$_POST['code'].',.*,.*,.*,.*,.*)\n/',$old_csv_string,$matches);
$old_row = $matches[1];

preg_match('/'.$_POST['code'].',(.*,.*,.*),.*,.*\n/',$old_csv_string,$matches_part);
$old_row_part = $matches_part[1];

$new_row_part = $_POST['class'].",".$_POST['value'].",".$_POST['status'];
$new_row = str_replace($old_row_part,$new_row_part,$old_row);
$new_csv_string = str_replace($old_row,$new_row,$old_csv_string);
file_put_contents($file,$new_csv_string);

那么我能比 10 行代码做得更好吗?任何建议将不胜感激 :)

注意:我尝试使用fgetcsv,但我不知道如何在二维数组中找到唯一代码,然后替换它的兄弟姐妹。

4

2 回答 2

1

尝试对每一行使用这样的拆分:

list($code, $class, $value, $status, $created, $redeemed) = split(",", $line, 6) ;

因此,您将每个字段都放在单独的变量中。当然,如果您不想复制标题,则需要注意第一行。

于 2012-08-30T23:03:09.097 回答
1

你为什么做这个 ?我认为您应该将数据存储在 SQL 表中。
每次用户更新数据时,都在表中进行。
如果您希望随时可以下载 CSV。仅当 your.csv 不存在时,使用 .htaccess 将 your.csv 重定向到 csv_generator.php。
如果 csv_generator.php 不存在,它将重新生成整个 csv,将其保存在硬盘上供以后使用,并在标题中使用正确的 mime/type 发送它(因此它对用户是透明的)。用户没有看到他正在请求一个 php 页面。
然后,每次有人更新数据时,您都需要删除硬盘上的 csv(因此它将在下一次请求时重新生成)

我认为这是随时准备在线下载 csv 的方法。

你知道谷歌文档这样做吗?用户可以更改电子表格中的数据,该电子表格可以从 url 下载为 csv(您需要将此电子表格发布为 csv 文件)。

于 2012-08-30T23:58:35.690 回答