PHP查找关键字并删除包含匹配关键字的整行

PHP查找关键字并删除包含匹配关键字的整行,php,function,csv,Php,Function,Csv,我正在为我的表单邮件脚本编写一个php脚本,以将发送的所有电子邮件发布到以管道分隔的csv文件,然后通过php数组显示csv文件。我需要允许用户通过将清单的id/发票号(清单行中的最后一个或第22个字段)传递到删除函数来删除条目,如下所示,但它删除了csv文件中的所有内容,而不仅仅是该行。这是我的密码。我比较传递给invoicenumber的id,如果它匹配,它应该删除该行并将其余的放回,但它删除了所有条目 我做了如下更正,但仍在删除所有条目: if ($_POST['action'] == "

我正在为我的表单邮件脚本编写一个php脚本,以将发送的所有电子邮件发布到以管道分隔的csv文件,然后通过php数组显示csv文件。我需要允许用户通过将清单的id/发票号(清单行中的最后一个或第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 
我想把所有其他条目都放在一边,我该怎么做呢?

有几件事

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) 正如Jack在评论中指出的那样,您正在覆盖循环中的$id,因此在您读取第一行csv数据时,其中的$u POST值就被破坏了。

两个修复。正如其他人所指出的,您使用
$id
有两个目的。更改:

$id= fgetcsv($handle)
致:

另外,在编写输出文件时,您正在将一个数组包装到另一个数组中,这是不需要的。更改:

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


为什么要在循环中覆盖
$id
“你不仅仅是删除一个字段,而是跳过整行”——这就是他说的他想要做的。他只是用这个字段作为是否删除它的标准。它有效吗?如果没有正确的格式,我无法告诉你评论中的代码。你不能在评论框中设置格式。编辑原始问题。哦,好的(我是新来这里发帖的)查看我的最新编辑。您忘记在
fgetcsv
调用中指定字段分隔符字符,因此它默认为逗号。
$list = array($data);
fputcsv($fptemp, $list);
fputcsv($data);