我正在使用外部类(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
数组,其中包含每个网址的更多信息(在我的情况下 - 页面大小)。所以缺少$key
变量。
此类支持回调中的额外参数(在我的情况下为$moreimfo
)。但据我所知,传递给每个回调的数据将始终相同。
$result
)的 $result->info['url']
对象。所以我可以用它来找到所需的数组元素。但是,如果数组的大小足够大,这看起来效率太低。
我认为我应该找到如何为EACH回调执行传递数组成员密钥信息。是否可以不修改原始类?
答案 0 :(得分:2)
如果您在$ 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);
}
);
使用anymous function&#34; Imports&#34; $ items数组通过引用。
答案 1 :(得分:1)
虽然它没有解决将对相应数组元素的引用传递给回调的原始问题,但以下应该非常快(如注释中所述,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方法,将回调作为一种方法,如果您使用global
$this->anyMember
- 数组化。