我在具有200,000条记录的MySQL数据库中有一个基表。

该表的结构如下:

    CREATE TABLE `npanxxmaster` (
  `npanxx` varchar(6) NOT NULL DEFAULT '',
  `npa` varchar(3) DEFAULT NULL,
  `ocn_lata` varchar(7) DEFAULT NULL,
  `lata` varchar(3) DEFAULT NULL,
  `st` varchar(2) DEFAULT NULL,
  `canada` varchar(10) DEFAULT NULL,
  `ext` varchar(10) DEFAULT NULL,
  `er` double DEFAULT NULL,
  `ra` double DEFAULT NULL,
  `un` double DEFAULT NULL
)


我将此表存储到一个数组中,键为npanxx值。

我有一个具有以下结构的纯csv文件:

npanxx(or npa only), ER, RA , UN


有关更多信息,npanxx是6位数字,npa始终是3位数字(来自npanxx)。

现在,此平面文件在第一列中可以具有npanxx(6位数字)或npa(3位数字)。

我需要做的是读取csv文件的每一行(我已经可以这样做),然后使用以下代码将其存储到数组中:

if (($handle = fopen($fileName, "r")) !== FALSE) {
    while (($row = fgetcsv($handle, 1000, ",")) !== FALSE){


现在来了棘手的部分。我需要做的是遍历每个$ row(csv文件中的行),并在我从MySQL表中获得的原始$ npanxxmaster数组中找到匹配项。我的问题是平面文件可以在其第一列中包含npanxx或npa。我需要做的就是将它们与$ npanxxmaster数组中匹配的npanxx或npa匹配,其中任何具有npanxx的$ row优先于只有npa的nrowxx。

例如:

如果在平面csv文件中给出以下$ rows:

201,.002,.002,.002
201200,.001,.001,.001


$ npanxxmaster数组中的所有npa为201的条目都将获得.002,.002,.002,而不是201200,否则将获得.001,.001,.001

我根本无法实现这一目标。我可以提供我尝试过的更多代码,也可以根据需要提供更多解释,因为我假设我已经解释了该解释。

预先感谢大家的帮助!

最佳答案

处理查询时,请创建两个数组。一个将NPANXX映射到行,另一个将NPA映射到NPANXX数组。

$npanxx_array = array();
$npa_array = array();
while ($row = $stmt->fetch()) {
    $npanxx = $row['npanxx'];
    $npa = $row['npa'];
    $npanxx_array[$npanxx] = $row;
    if (!isset($npa_array[$npa])) {
        $npa_array[$npa] = array();
    }
    $npa_array[$npa][] = $npanxx;
}


然后,当您处理CSV时,您可以查找适当的字段。

while ($row = fgetcsv($handle)) {
    if (strlen($row[0]) == 6) {
        $npanxx_to_update = array($row[0]);
    } else {
        $npanxx_to_update = $npa_array[$row[0]];
    }
    foreach ($npaxx_to_update as $npanxx) {
        // update $npanxx_array[$npanxx]
    }
}

10-08 17:19