2013-03-27 50 views
3

我们有一些客户数据在一个单独的数据存储区中启动。我有一个合并脚本来标准化并将其迁移到我们的核心数据库中。有大约60,000-70,000条记录正在迁移。PHP多维数组:找到一个多元素的子数组匹配...有循环的替代选项吗?

当然,有一个小错误,它在第9k行左右失败。
我的下一个诀窍是让脚本能够在它再次运行时停下来。


FYI:
由什么品牌,他们购买的源记录是相当恶心和拆分超过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)循环,并跳过那些被发现已经迁移(否则,他们会得到重复的)任何行。
这似乎是一个循环给我的LOT
那么我们什么时候开始记录40或50万记录呢?
这将是50k x 50k循环!

问:
有没有更好的办法,我来检查,如果子阵列具有“ROW_ID”和不是每次循环“source_tbl”比赛其他


注:一如既往,如果有一个完全不同的方式我应该考虑这一点,我接受任何和所有的建议:)

+0

你可能想看看http://stackoverflow.com/questions/163336/slicing-a-multi-dimensional-php-array-across-one-of-its-elements – Ian 2013-03-27 16:23:43

+0

该链接让我的气味一些非常有用的信息。由于-A-一堆。 – mOrloff 2013-03-27 16:46:06

回答

0

我认为你应该对日志执行一个散列(或复合键)row_id andsource_tbl的日志进行预处理,并将其存储在散列表中,然后为每一行构造散列密钥并检查它是否已在散列映射中定义。

我告诉你使用散列集合,因为你可以在O(k)时间内搜索它,否则它会和你只是建议它是一个更干净的代码一样。

+0

宾果!这是“完全不同的方式,我应该考虑这个”的完美例子。谢谢。 – mOrloff 2013-03-27 16:47:32