我有两个大的二维数组(从某些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 ){
...
}
}
}
答案 0 :(得分:1)
使用SQL会更快,因为大多数SQL引擎都针对连接进行了优化,并且您的方法是一种强力方法。但是,将所有数据插入MySQL表是一项非常繁重的任务,因此它仍然不是最佳解决方案。
我建议你在PHP中加入 - 但是使用更智能的算法。首先按要匹配的字段对两个数组进行排序。将两个排序的数组一起迭代 - 使用两个迭代器(或指针或索引或其他) - 让我们说a
遍历A
和b
遍历B
。在循环的每次迭代中,比较a
和b
指向的元素的比较字段。如果a
更小 - 提前a
。如果b
更小 - 提前b
。如果a
等于b
,则表示您有一个匹配项,您应将其存储在新列表中,然后同时推进a
和b
(假设这种关系是一对一的 - 如果它是一对多的你只推进许多迭代器,如果它是多对多的,你需要更复杂的解决方案。)