PHP CSV提取匹配行只运行一次,速度较慢

PHP CSV提取匹配行只运行一次,速度较慢,php,csv,Php,Csv,我在一组ID中循环,并将它们与src CSV文件进行比较,当它找到匹配的ID时,会将其放入新的dest CSV文件中 src CSV ids,value,color 1,value1 ,red 2,value2,oramge 3,value3,blue 4,value4,purple 5,value5,pink 6,value6,yellow 7,value7,green 8,value8,black 9,value9,white php $ids = array( "7", "9", "3"

我在一组ID中循环,并将它们与src CSV文件进行比较,当它找到匹配的ID时,会将其放入新的dest CSV文件中

src CSV

ids,value,color
1,value1 ,red
2,value2,oramge
3,value3,blue
4,value4,purple
5,value5,pink
6,value6,yellow
7,value7,green
8,value8,black
9,value9,white
php

$ids = array(
"7",
"9",
"3"
);


$srcFile = fopen("src.csv", "r");

$destFile = fopen("dest.csv","w");

foreach ($ids as $id) {

    while (($row = fgetcsv($srcFile, 0, ",")) !== FALSE) {

        if ($row[0] == $id) {

            fputcsv($destFile, $row);

        }

    }

}

fclose($srcFile);
fclose($destFile);
我遇到的问题是,它只运行一次,并在找到第一个匹配项后退出。另外,如果我用一千条记录来代替,我不确定这个方法的效率

哪里出错了?

用于检查数组中是否存在csv行id

你应该试试下面的代码-

PHP

<?php
$ids = array(
    "7",
    "9",
    "3"
);


$srcFile = fopen("src.csv", "r");

$destFile = fopen("dest.csv","w");

while (($row = fgetcsv($srcFile, 0, ",")) !== FALSE) {
    echo $row[0];
    if (in_array($row[0], $ids)) {
        fputcsv($destFile, $row);
    }
}

fclose($srcFile);
fclose($destFile);
?>

用于检查数组中是否存在csv行id

你应该试试下面的代码-

PHP

<?php
$ids = array(
    "7",
    "9",
    "3"
);


$srcFile = fopen("src.csv", "r");

$destFile = fopen("dest.csv","w");

while (($row = fgetcsv($srcFile, 0, ",")) !== FALSE) {
    echo $row[0];
    if (in_array($row[0], $ids)) {
        fputcsv($destFile, $row);
    }
}

fclose($srcFile);
fclose($destFile);
?>

可能是因为您在对数组中的每个ID执行
循环时重复了
。尝试像这样使用代码,并使用以下命令搜索ID:


可能是因为您在对数组中的每个ID执行
循环时重复了
。尝试像这样使用代码,并使用以下命令搜索ID:



您的源CSV总是要被排序吗?问题是您在磁盘访问函数(
fgetcsv
fputcsv
)上循环,这些函数的速度比仅使用内存的操作慢。尝试将整个源文件放入一个数组,并在该数组上执行搜索,将“找到的”值放入一个新数组。然后在末尾将新阵列写入磁盘<代码>$vals=array_map('str_getcsv',file('./src.csv')
源CSV总是要被排序吗?问题是你在磁盘访问函数(
fgetcsv
fputcsv
)上循环,这些函数的速度比仅使用内存的操作慢。尝试将整个源文件放入一个数组,并在该数组上执行搜索,将“找到的”值放入一个新数组。然后在末尾将新阵列写入磁盘<代码>$vals=array_map('str_getcsv',file('./src.csv')