如何让ArrayIterator或ArrayObject与implode一起使用?

8
我在使用ArrayIterator时遇到了一些问题(事实上,使用ArrayObject也有相同的问题)。
对于99%的情况,我的扩展ArrayIterator像数组一样运行良好。
不幸的是,implode()不喜欢被赋予ArrayIterator(或ArrayObject)。
我无法在文档中找到任何建议实现扩展ArrayIterator的其他类,也没有任何其他要重写的方法。
有人能建议如何解决这个问题吗?(注意:每次使用implode进行强制转换成数组不是一个解决方案,因为我希望这个类似数组的对象完全像数组一样工作,而且使用它的代码不需要知道/关心/强制转换)。
2个回答

10

最简单且正确的解决办法是使用iterator_to_array将迭代器转换为数组,再传入implode函数中,例如:

$traversable = /* your iterator, ArrayObject or any other type of Traversable */
echo implode(",", iterator_to_array($traversable));

只要是可以用 foreach 进行迭代的东西,这将按预期工作。


1
谢谢Jon。我将把这个设置为被接受的答案,因为它是一个有用的函数,我不知道。然而,这需要调用者知道它不是在处理数组并进行强制转换。它很慢,需要额外的代码,并冒犯了任何可能存在的黑盒子思想。希望PHP开发人员有一天能让所有数组函数接受从Array类或类似类继承的对象,或者共享的公共基础。 - Oli Comber
@OliComber:那肯定很好,但说实话,这将是如此重大的改变,以至于我真的看不到它会发生。 - Jon

0

尝试将数组进行向下转型 ((array) $arrayObject) : implode(",", (array) $arrayObject);


3
小心,类型转换可能会导致意想不到的结果(尤其是在转换继承自其他类的对象时)。 - Elias Van Ootegem
1
如果您感兴趣,这里有更多关于将对象转换为数组的详细信息。同时请测试嵌套对象...强制转换不是递归的! - Elias Van Ootegem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接