PHP查找关键字并删除具有匹配关键字的整行

时间:2012-09-03 16:19:23

标签: php function csv

我正在为我的表单邮件脚本编写一个php脚本,将所有发送到管道分隔的csv文件的电子邮件发布,然后我通过php数组显示csv文件。我需要允许用户通过将列表的id / invoice号(该列表中的最后一个或第22个字段)从该列表传递到删除函数来删除条目,如下所示,但它删除了csv文件中的所有内容,不只是那条线。这是我的代码。我比较传递给invoicenumber的id如果它匹配它应删除该行并将其余部分放回去,但是它会删除所有条目。

我做了如下更正,但它仍在消除所有条目:

if ($_POST['action'] == "Delete")
{
    $id = $_GET['id'];
    $fptemp = fopen('data-temp.csv', "a+");
    if (($handle = fopen($dataFile, "r")) !== FALSE)
    {
        while (($data= fgetcsv($handle)) !== FALSE)
        {
            if ($id != $data[22])
            {
                fputcsv($data);
            }
        }
        fclose($handle);
        fclose($fptemp);
        unlink($dataFile);
        rename('data-temp.csv',$dataFile);
    }
}

所以我的csv文件中有以下条目

1346785585|Martha|Stewart|karen@someplace.com|555-444-2222|578 dude rd|dude|TN|57660|usa|Do it Yourself Cooking Book||389|12|||360|12|Credit Card|www.something.com||98.143.4.228|6c67b98 
1346785588|Karen|b|karen@someplace.com|555-444-2222|578 dude rd|dude|TN|57660|usa|Do it Yourself WebSite||389|12|||360|12|Credit Card|www.something.com||98.143.4.228|464b4ec

我想找到发票编号,这是该行中的最后一个字段,所以我想说我想找到“464b4ec”并删除整个条目

1346785588|Karen|b|karen@someplace.com|555-444-2222|578 dude rd|dude|TN|57660|usa|Do it Yourself WebSite||389|12|||360|12|Credit Card|www.something.com||98.143.4.228|464b4ec 

我想单独留下所有其他条目,我该怎么做?

2 个答案:

答案 0 :(得分:1)

两个修复。正如其他人所指出的那样,你正在使用$id来做两件事。变化:

$id= fgetcsv($handle)

为:

$data = fgetcsv($handle, 0, '|')

此外,当您编写输出文件时,您将数组包装在另一个数组中,这是不需要的。变化:

$list = array($data);
fputcsv($fptemp, $list);

为:

fputcsv($data);

答案 1 :(得分:0)

一些事情

a)fgetcsv()从刚刚读取的csv数据行返回一个字段数组。您将整个数组与(单个?)项$data[22]进行比较。除非数据[22]本身就是一个数组,否则这不会像你期望的那样工作

如果$ data不是数组,则将其视为字符串,并将$ id与字符串中的第22个字符进行比较。

b)$ data已经是一个数组,然后你将其换行到另一个数组 - array($data)。所以......我猜测$ data实际上是一个字符串。

c)因为如果你的id v.s数据比较不匹配你只做fputcsv,你不是只删除一个字段 - 你跳过整行。要仅删除数组中的第22个项目,它必须是

if ($id == $data[22) {
   unset($data[22]);
}
fputcsv($fptemp, $data);

d)正如杰克在评论中指出的那样,你在循环中覆盖了$ id,所以当你读取第一行csv数据时,你所拥有的$ _POST值就会被破坏。