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

时间:2015-10-06 10:23:38

标签: php arrays curl callback

我正在使用外部类(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回调执行传递数组成员密钥信息。是否可以不修改原始类?

2 个答案:

答案 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 - 数组化。