array_map使用数组接口进行收集?

2022-08-30 14:53:04

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

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

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

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


答案 1

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

array_map($fn, iterator_to_array($myCollection));

除了循环访问集合两次之外,它还会生成一个以后不会使用的数组。

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

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

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

    return $result;
}

更新

从您的用例来看,您似乎甚至对地图操作的结果都不感兴趣;因此,使用iterator_apply()更有意义。

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

    return true;
});

答案 2

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

除了 产生一个潜在的大型临时数组之外,没有任何技巧可以使可迭代对象与 .iterator_to_array()array_map

函数式 PHP 库有一个适用于任何可迭代集合的实现。map