将参数传递给处理数组的回调函数


Passing an argument to callback function working on an array

我使用一个外部类(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);
    }
);
使用一个匿名函数,通过引用"导入"$items数组。

虽然它不能解决将对数组元素的引用传递给回调的原始问题,但以下操作应该非常快(如评论中所述,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化。