0

我有一个工作脚本,但我确信我管理数组的方法可能会更好。我一直在寻找解决方案,但没有找到,但我确信我应该使用关联数组的功能来更有效地做事。

我有两个数组,一个来自 CSV 文件,一个来自数据库。我已经将 CSV 数组创建为数字数组,将 DB 数组创建为关联数组(尽管我知道 PHP 中的区别很模糊)。

我试图在 DB 数组中找到一个记录,其中一个字段中的值与 CSV 数组中的值匹配。两个数组都是多维的。

在每个数组的每个记录中都有一个参考编号。它在 CSV 数组中出现一次,并且可能出现在 DB 数组中。如果是这样,我需要采取行动。

我目前正在这样做(简化):

$CSVarray:
('reference01', 'blue', 'small' ),
('reference02', 'red', 'large' ),
('reference03', 'pink', 'medium' )

$Dbarray:
(0 => array(ref=>'reference01',name=>"tom",type=>"mouse"),
(1 => array(ref=>'reference02',name=>"jerry",type=>"cat"),
(2 => array(ref=>'reference03',name=>"butch",type=>"dog"),



foreach ($CSVarray as $CSVrecord) {
    foreach ($Dbarray as $DBrecord) {
        if ($CSVarray[$numerickey] == $DBrecord['key'] {
            do something with the various values in the $DBrecord 
        }
    }
}

这太可怕了,因为每个数组都有数千行。

我不只是想知道是否存在匹配值,我想从匹配记录中检索数据,所以像 'array_search' 这样的函数不会做我想要的,并且 array_walk 似乎并不比我目前的方法好。

我真正需要的是这样的(乱码):

foreach ($CSVarray as $CSVrecord) {
    WHERE $Dbarray['key']['key'] == $CSVrecord[$numerickey] {
        do something with the other values in $Dbarray['key']
    }
}

我正在寻找一种使用键(数字或关联)而不是遍历数组来匹配值的方法。任何人都可以提供任何帮助吗?

4

3 回答 3

2

使用哈希映射 - 获取一个数组并将其所属记录的每个键映射到该记录。然后获取第二个数组并简单地对其进行迭代,检查每个记录键是否已为哈希图设置了任何内容。关于你的例子:

foreach ($DBarray as $DBrecord){
   $Hash[$record[$key]] = $DBrecord;
}

foreach ($CSVarray as $record){
   if (isset($Hash[$record[$CSVkey]])){
       $DBrecord = $Hash[$record[$CSVkey]];
        //do stuff with $DBrecord and $CSVrecord
   }
}

此解决方案适用于 O(n),而您的解决方案适用于 O(n^2)...

于 2012-07-26T15:41:39.890 回答
0

你也可以像这样使用 foreach 循环:

foreach ($record as $key => $value) {
  switch($key)
  {
    case 'asd':
      // do something
      break;
    default:
      // Default
      break;
  }
}

开关也可能是您正在寻找的东西:)

于 2012-07-26T15:34:09.743 回答
0

将 CSV 加载到数据库中,并尽可能使用 db(不是 db 数组)进行检索。索引 referenceid 字段。

于 2012-07-26T15:38:02.917 回答