如何优化数组搜索值取消设置并重新索引搜索到的数组?

时间:2014-05-12 13:03:08

标签: php arrays optimization google-analytics google-analytics-api

如何优化数组搜索值取消设置并重新索引搜索到的数组?没问题,如果我有少量数据要搜索,并且数量较少的数据比较。但我的应用程序是从Google AnalyticsAPI获取所有网络媒体资源链接(2695)!在将结果显示在屏幕上之前,我需要过滤所有链接,以便从结果数组中删除列入黑名单的链接(不会在结果页面上显示)。

$b_links; //blacklisted links approximate amount 100-150
$google['analytics']; //all links from analytics except site search links  (~3000 links)
foreach ($b_links as $b_link){
    foreach ($google['analytics'] as $index=>$a_link){
            if ($b_link->uri===$a_link[0]){
                      unset($google['analytics'][$index]);
            }
     }
}

$google['analytics'] = array_values($google['analytics']);

我得到了 - > 致命错误:允许的内存大小为134217728字节耗尽 之后

  

ini_set('memory_limit',' - 1');

我得到了> 致命错误:最长执行时间为30秒 任何想法如何我可以重新分解代码使用更少的内存和使用更少的执行时间。我试图将不需要的链接列表作为过滤器发送到Analytics api,但谷歌限制请求URI到2000个字符!谢谢你的帮助!

我如何使用array_filter?可能吗?它会更快吗?

2 个答案:

答案 0 :(得分:2)

以下构造应该更快:

首先反转$b_links

$b_links_reversed = array();
foreach($b_link => $b) {
    $b_links_reversed[$b->uri] = true;
}

访问关联数组应该更快。现在我们可以用一个foreach来做到这一点:

foreach ($google['analytics'] as $index=>$a_link){
    if (isset($b_link_reversed[$a_link[0]])){
        unset($google['analytics'][$index]);
    }
}

答案 1 :(得分:0)

我将提出三项修改。

  1. 将foreach改为正常。这会减少您制作的内存副本数量。
  2. 使用array_splice代替取消设置。这可能比未设置稍慢,但它实际上会从数组中删除值和索引,从而减少内存占用。
  3. 使用break语句可以在找到项目后避免在内循环上出现额外的循环。
  4. 示例代码:

    for($l = sizeof($links) - 1; $l >= 0; --$l) {
        for($a = sizeof($google['analytics']) - 1; $a >= 0; --$a) {
            if($b_links[$l]->uri === $$google['analytics'][$a]->$a_link) { //I think this check is slightly wrong, I'm not familiar with the => you use
                array_splice($links, $l, 1); //Remove the current element
                break;
            }
        }
    }