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

f1a*_*mes 26 php arrays iterator array-map

我有一个名为Collectionstore 的类,它存储相同类型的对象. Collection实现阵列接口:Iterator,ArrayAccess,SeekableIterator,和Countable.

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

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

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

Ja͢*_*͢ck 26

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

array_map($fn, iterator_to_array($myCollection));
Run Code Online (Sandbox Code Playgroud)

除了迭代集合两次之外,它还会产生一个之后不会使用的数组.

另一种方法是编写自己的地图功能:

function map(callable $fn)
{
    $result = array();

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

    return $result;
}
Run Code Online (Sandbox Code Playgroud)

更新

根据您的用例判断,您似乎对地图操作的结果不感兴趣; 因此使用起来更有意义iterator_apply().

iterator_apply($myCollection, function($obj) {
    $obj->method1();
    $obj->method2();

    return true;
});
Run Code Online (Sandbox Code Playgroud)

  • @EelkevandenBos我在答案中提出了两个解决方案,后者没有表现出这种"性能损失"; 除此之外,在两种情况下,运行时都是O(n). (2认同)

dec*_*eze 7

array_map顾名思义,想要数组.iterator_map毕竟没有打电话.;)

除了iterator_to_array()产生可能很大的临时数组之外,没有任何技巧可以使可迭代对象使用array_map.

功能PHP库有map其上可迭代的收集工作的落实.