我使用一个外部类(Zebra_cURL)来执行多个HTTP GET请求。它的工作方式如下:
$items = array(
0=>array('url' => 'url0'),
1=>array('url' => 'url1'),
2=>array('url' => 'url2'),
3=>array('url' => 'url3'),
);
$curl = new Zebra_cURL();
$curl->get(array_column($urls,'url'),'scan_item',$moreimfo);
function scan_item($result,$moreimfo){
$items[$key]['size'] = strlen($result->body);
}
所以我的回调应该填补我的$items
数组与每个url的更多信息(在我的情况下-页面的大小)。所以缺少了一个$key
变量
这个类在回调中支持额外的参数(在我的例子中是$moreimfo
)。但据我所知,传递给每个回调的数据将始终相同。
包含原始url信息($result->info['url']
)的$result
对象。所以我可以用它来找到需要的数组元素。然而,当数组的大小足够大时,这看起来效率太低了。
我认为我应该找到如何传递每个回调执行数组成员键信息。有没有可能不修改原来的类?
如果在$items数组中使用url作为键,那么解决方案可以是
<?php
$items = [
'url0'=>array('url' => 'url0'),
'url1'=>array('url' => 'url1'),
'url2'=>array('url' => 'url2'),
'url3'=>array('url' => 'url3'),
];
$curl = new Zebra_cURL();
$curl->get(
array_keys($items),
function($result) use (&$items) {
$key = $result->info['url'];
$items[$key]['size'] = strlen($result->body);
}
);
虽然它不能解决将对数组元素的引用传递给回调的原始问题,但以下操作应该非常快(如评论中所述,PHP数组是使用散列表实现的)。
$items = array(
0=>array('url' => 'url0'),
1=>array('url' => 'url1'),
2=>array('url' => 'url2'),
3=>array('url' => 'url3'),
);
$lookup=array();
foreach($lookup as $k=>$v) {
$lookup[$v['url']]=$k;
}
$curl = new Zebra_cURL();
$curl->get(array_column($urls,'url'),'scan_item',$moreimfo);
function scan_item($result,$moreimfo){
global $lookup,$items;
$items[$lookup[$result->info['url']]]['size'] = strlen($result->body);
}
您可能会考虑使用oop方法,将回调作为方法,那么如果您使用$this->anyMember
global
化。