首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有数组接口的集合上的array_map?

具有数组接口的集合上的array_map?
EN

Stack Overflow用户
提问于 2013-04-29 07:23:05
回答 5查看 23.1K关注 0票数 30

我有一个名为Collection的类,它存储相同类型的对象。Collection实现数组接口:IteratorArrayAccessSeekableIteratorCountable

我想将一个Collection对象作为数组参数传递给array_map函数。但是这个错误失败了。

PHP : array_map():参数2应该是一个数组

我能否通过实现其他/更多接口来实现这一点,以便将Collection对象视为数组?

EN

回答 5

Stack Overflow用户

发布于 2013-04-29 08:33:59

array_map()函数不支持将Traversable作为数组参数,因此必须执行转换步骤:

代码语言:javascript
复制
array_map($fn, iterator_to_array($myCollection));

除了对集合进行两次迭代之外,它还生成了一个以后不会使用的数组。

另一种方法是编写自己的map函数:

代码语言:javascript
复制
function map(callable $fn)
{
    $result = array();

    foreach ($this as $item) {
        $result[] = $fn($item);
    }

    return $result;
}

更新

根据您的用例判断,您甚至对映射操作的结果都不感兴趣;因此,使用iterator_apply()更有意义。

代码语言:javascript
复制
iterator_apply($myCollection, function($obj) {
    $obj->method1();
    $obj->method2();

    return true;
});
票数 30
EN

Stack Overflow用户

发布于 2013-04-29 08:31:40

顾名思义,array_map想要数组。毕竟这不叫iterator_map。;)

除了产生潜在的大型临时数组的iterator_to_array()之外,没有使可迭代对象与array_map一起工作的诀窍。

功能PHP库有一个map实现,它适用于任何可迭代的集合。

票数 9
EN

Stack Overflow用户

发布于 2015-03-05 22:15:31

如果您对创建一个映射到原始数组上的函数不感兴趣,那么只需使用foreach循环即可(因为您实现了Iterator)。

代码语言:javascript
复制
foreach($item in $myCollection) {
    $item->method1();
    $item->method2();
}

如果您真的想使用map,那么我认为您必须实现自己的地图。我建议把它作为收藏的一种方法,如:

代码语言:javascript
复制
$mutatedCollection = $myCollection->map(function($item) { 
    /* do some stuff to $item */
    return $item;
});

我会问你自己,你是真的想使用map,还是真的是指foreach

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16273233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档