我有一个名为Collection的类,它存储相同类型的对象。Collection实现数组接口:Iterator、ArrayAccess、SeekableIterator和Countable。
我想将一个Collection对象作为数组参数传递给array_map函数。但是这个错误失败了。
PHP : array_map():参数2应该是一个数组
我能否通过实现其他/更多接口来实现这一点,以便将Collection对象视为数组?
发布于 2013-04-29 08:33:59
array_map()函数不支持将Traversable作为数组参数,因此必须执行转换步骤:
array_map($fn, iterator_to_array($myCollection));除了对集合进行两次迭代之外,它还生成了一个以后不会使用的数组。
另一种方法是编写自己的map函数:
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;
});发布于 2013-04-29 08:31:40
顾名思义,array_map想要数组。毕竟这不叫iterator_map。;)
除了产生潜在的大型临时数组的iterator_to_array()之外,没有使可迭代对象与array_map一起工作的诀窍。
功能PHP库有一个map实现,它适用于任何可迭代的集合。
发布于 2015-03-05 22:15:31
如果您对创建一个映射到原始数组上的函数不感兴趣,那么只需使用foreach循环即可(因为您实现了Iterator)。
foreach($item in $myCollection) {
$item->method1();
$item->method2();
}如果您真的想使用map,那么我认为您必须实现自己的地图。我建议把它作为收藏的一种方法,如:
$mutatedCollection = $myCollection->map(function($item) {
/* do some stuff to $item */
return $item;
});我会问你自己,你是真的想使用map,还是真的是指foreach
https://stackoverflow.com/questions/16273233
复制相似问题