繁体   English   中英

PHP多维数组:查找多元素子数组匹配...是否有循环的备用选项?

[英]PHP Multi-Dimensional Array: Finding a multi-element sub-array match … is there an alternate option to looping?

我们有一些客户数据在一个单独的数据存储中开始。 我有一个合并脚本来标准化并将其迁移到我们的核心数据库中。 有大约60,000-70,000条记录正在迁移。

当然,有一个小虫子,它在第9k排失败了。
我的下一个技巧是让脚本能够在再次运行时从中断处继续。


供参考:
源记录非常蹩脚,并按照他们购买的品牌划分了5个表... IE:

create TABLE `brand1_custs` (`id` int(9), `company_name` varchar(112), etc...)
create TABLE `brand2_custs` (`id` int(9), `company_name` varchar(112), etc...)

当然,给定的公司名称可以(并且确实)存在于多个源表中。


无论如何......我使用ParseCSV lib进行日志记录,如果成功迁移,每行都会被记录(如果它们过于丑陋而无法以编程方式解析,则会跳过某些行)。 使用ParseCSV打开日志时,它看起来像:

array(
  0 => array( 'row_id'   =>  '1', 
          'company_name' =>  'Cust A', 
          'blah'         =>  'blah', 
          'source_tbl'   =>  'brand1_cust'
      ),
  1 => array( 'row_id'   =>  '2',
          'company_name' =>  'customer B',
          'blah'         =>  'blah',
          'source_tbl'   =>  'brand1_cust'
      ),
  2 => array( 'row_id'   =>  '1',
          'company_name' =>  'Cust A',
          'blah'         =>  'blah',
          'source_tbl'   =>  'brand2_cust'
      ),
  etc...
)


我目前的工作流程如下:

foreach( $source_table AS $src){
    $results = // get all rows from $src
    foreach($results AS $row){
        // heavy lifting
    {
}


我的计划是检查
$row->id$src->tbl组合
在比赛中
$log[?x?]['row_id']$log[?x?]['source_tbl']组合。

为了实现这一目标,我将不得不做foreach($log AS $xyz) 内部循环foreach($results AS $row)循环,并跳过那些被发现已迁移的所有行(否则,他们会得到重复)。
这似乎是很多循环给我。
当我们在#40或5万的记录中起床时怎么样?
这将是50k x 50k循环!!

题:
有没有更好的方法让我检查一个子数组是否有“row_id”和“source_tbl”匹配不是每次循环?


注意:一如既往,如果有一种完全不同的方式我应该考虑这个,我对任何和所有的建议开放:)

我认为您应该对日志执行row_id and source_tbl的散列(或组合键)的row_id and并将其存储在散列映射中,然后为每一行构建密钥的散列并检查它是否已在散列映射中定义。

我告诉你使用散列集,因为你可以用O(k)时间搜索它,否则它就像你提出的那样只是一个更干净的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM