PHP多维数组:查找多元素子数组匹配是否有替代循环的选项



我们有一些客户数据,它们开始于一个单独的数据存储。我有一个整合脚本来标准化并将其迁移到我们的核心数据库。大约有6万到7万条记录正在被迁移。

当然,这里有一个小错误,在第9k行左右失败了。
我的下一个技巧是使脚本能够在再次运行时恢复到它停止的位置。


供参考:
来源记录非常讨厌,并且根据他们购买的品牌划分为5个表…即:

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库进行日志记录,如果成功迁移,则记录每一行(如果某些行太丑而无法通过编程解析,则跳过它们)。当使用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($results AS $row)循环中执行foreach($log AS $xyz)循环,并跳过发现已经迁移的任何行(否则,它们将被复制)。这看起来像是一个LOT的循环。
当我们达到4万或5万的时候呢?
这将是50k x 50k的循环!!

问题:
是否有更好的方法让我检查子数组是否有"row_id"one_answers"source_tbl"匹配其他而不是每次循环?


注意:和往常一样,如果有一个完全不同的我应该考虑这个问题,我愿意接受任何和所有的建议:)

我认为你应该在日志上做一个预处理,做row_id and source_tbl的哈希(或组合键),并将其存储在一个hashmap中,然后为每一行构建键的哈希,并检查它是否已经在hashmap中定义。

我告诉你使用哈希集,因为你可以用O(k)时间搜索它,否则它将与你所建议的相同,只是它将是一个更干净的代码。

相关内容

  • 没有找到相关文章

最新更新