0

我有两个大的二维数组(从一些 xml 数据中提取)一个(A 列表)是约 1000 个包含 5 个字段的项目,另一个(B 列表)在 10.000-12.000 个包含 5 个字段的项目之间。

我的想法是将列表 A 的每个 id 键与列表 B 的每个 id 键进行比较,并在“true”上组成一个新的组合字段数组,或者如果不匹配,则仅来自数组 A 的字段。

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

这两种结构的形式和我需要的结果立刻让我想起了 sql join。

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

编辑:

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

编辑 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 列表除“代码”字段外其他所有内容都相似,这是唯一可用于比较的字段

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
            )

正如您所看到的,每个提要都有通用代码,但有一些不同的随机数据作为前缀或后缀,因此在每个循环中,我必须对字符串执行一些操作以进行 stripos 或将其与提要 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 ){
                        ...
                    }




                    }


            }
4

1 回答 1

1

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

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

于 2013-11-12T01:51:27.367 回答