PHP - 从多维数组中检索值

时间:2012-07-26 15:29:46

标签: php arrays

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

我有两个数组,一个来自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']
    }
}

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

3 个答案:

答案 0 :(得分:2)

使用哈希映射 - 获取一个数组并将其所属记录的每个键映射到该记录。然后获取第二个数组并简单地迭代它,检查每个记录键,如果hashmap有任何设置。 关于你的例子:

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)...

答案 1 :(得分:0)

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

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

您可能正在寻找开关:)

答案 2 :(得分:0)

将CSV加载到db中,如果可能,请使用db(而不是db array)进行检索。索引referenceid字段。