如何优化数组搜索值取消设置并重新索引搜索到的数组?没问题,如果我有少量数据要搜索,并且数量较少的数据比较。但我的应用程序是从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?可能吗?它会更快吗?
答案 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)
我将提出三项修改。
示例代码:
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;
}
}
}