如何使PHP代码更高效?(在CSV文件中编辑一行)

如何使PHP代码更高效?(在CSV文件中编辑一行),php,csv,Php,Csv,这段代码可以工作,但我只是利用我有限的PHP知识对其进行了黑客攻击,我相信有一种更优雅、更高效的方法可以实现这一点。如果您能指出我可以如何改进,那就太好了 我有一个CSV文件,结构如下: Code Class Value Status Date Created Date Redeemed ======================================================================== a51f3g45

这段代码可以工作,但我只是利用我有限的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...
用户填写表单以更改给定行的状态字段。我拼凑了以下代码,用新值替换旧值:

$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
,但我不知道如何在二维数组中找到唯一的代码,然后替换其同级。

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

list($code, $class, $value, $status, $created, $redeemed) = split(",", $line, 6) ;
因此,您将在单独的变量中包含每个字段。 当然,如果您不想复制标题,您需要注意第一行。

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

我认为这是一种随时可以在线下载csv的方法


你知道google doc会这么做吗?用户可以更改可从url下载为csv的电子表格中的数据(您需要将此电子表格发布为csv文件)。

csv文件有多大?是否可以简单地再次写入整个文件?这将为您保存那些正则表达式…是这样的格式化文件(当然没有标题和==),还是您格式化了它?如果没有格式化,那么是什么分隔字段?空格、空格或选项卡?如果它是一个字符,那么你可以分割每一行。我怀疑它会超过100行。但是表单只提交其中一行的信息-没有regex我如何查找/替换?@Grzegorz我只是让它看起来很漂亮。它以逗号分隔,带有标题行。使用CSV作为数据库将导致问题。SQLite将是更合适的解决方案。这将在值中包含
的带引号的字段上中断。CSV还可以在字段中包含换行符。使用合适的CSV解析器比一起破解一些简单的东西更可取。同意,但是上面显示的数据并不表明这些问题。我完全同意您的观点,对于通用csv文件,解析器是正确的解决方案。感谢您的详细解释。这一天,我终于从未加密的平面文件跳到了SQLite:)很高兴在这方面为您提供帮助。这样做是一个非常好的练习,会让你接触到PHP的许多有用的方面(数据库、编写文件、.htaccess重定向、标题…)