数组比较与SQL连接

时间:2013-11-12 01:27:05

标签: php mysql performance multidimensional-array iteration

我有两个大的二维数组(从某些xml数据中提取)一个(一个列表)是〜1000个项目,另外包含5个字段( B列表 )是恐怖的10.000-12.000项目,包含5个字段。

我的想法是将列表A的EACH id键与列表B的EACH id键进行比较,并在“true”上组合一个新的组合字段数组,或者只是组合字段A中的字段(如果不匹配)。

我使用嵌套的foreach循环,最终需要花费很长时间来处理数百万次迭代。不用说......不是解决方案。

这两个结构的形式和我需要的结果直接提醒我一个sql连接。

问题是: 1.)我应该尝试sql或嵌套的foreach可能不是最好的PHP方式? 2.)关系查询会比迭代快得多吗?

修改

我仅定期从xml文件(在单独的进程中)提取数据,该文件包含每个节点10个以上的字段。比我将我需要的5个字段存储在CSV文件中以便稍后与我从mysql数据库中提取的表A进行比较。基本上与新鲜Feed的属性目录更新非常相似。 我很害怕存储到CSV的最初想法是一个错误,我应该只将Feed更新保存到数据库中。

编辑2

数组列表B看起来像这样

Array
(
    [0] => Array
        (
            [code] => HTS541010A9E680
            [name] => HDD Mobile HGST Travelstar 5K100 (2.5", 1TB, 8MB, SATA III-600)
            [price] => 385.21
            [avail] => 0
            [retail] => asbis
        )
...
...

虽然A列表除了'code'字段以外都是相似的,而'code'字段是唯一可用于比较的字段

Array
    (
        [0] => Array
            (
                [code] => ASD-HTS541010A
                [name] => HDD Mobile HGST Travelstar 5K100 (2.5", 1TB, 8MB, SATA III-600)
                [price] => 385.21
                [avail] => 0
                [retail] => asbis
            )

正如您所看到的,每个Feed都有通用代码但是一些不同的随机数据作为前缀或后缀,所以在每个循环中我必须对字符串进行一些操作才能进行stripos或将它与feed id进行比较以进行匹配或关闭匹配。

伪代码:

$mylist = loadfromDB();
$whslist = loadfromCSV();

        foreach ($mylist as $myl) {
                foreach ($whslist as $whl){


                    if ((stripos(code_a,code_b) OR (code_b,code_a) !== false)){
                                        ...
                    }
                    elseif (stripos(substr(strstr(code_a,'-'),1),code_b) !== false) {
                        ...
                    }
                    elseif (stripos( substr(code_a,0,-5);) == !false ){
                        ...
                    }




                    }


            }

1 个答案:

答案 0 :(得分:1)

使用SQL会更快,因为大多数SQL引擎都针对连接进行了优化,并且您的方法是一种强力方法。但是,将所有数据插入MySQL表是一项非常繁重的任务,因此它仍然不是最佳解决方案。

我建议你在PHP中加入 - 但是使用更智能的算法。首先按要匹配的字段对两个数组进行排序。将两个排序的数组一起迭代 - 使用两个迭代器(或指针或索引或其他) - 让我们说a遍历Ab遍历B。在循环的每次迭代中,比较ab指向的元素的比较字段。如果a更小 - 提前a。如果b更小 - 提前b。如果a等于b,则表示您有一个匹配项,您应将其存储在新列表中,然后同时推进ab(假设这种关系是一对一的 - 如果它是一对多的你只推进许多迭代器,如果它是多对多的,你需要更复杂的解决方案。)