【问题标题】:How can I make ArrayIterator or ArrayObject work with implode?如何使 ArrayIterator 或 ArrayObject 与 implode 一起工作?
【发布时间】:2013-09-10 11:59:28
【问题描述】:

我在使用 ArrayIterator 时遇到了一些问题(实际上,使用 ArrayObject 时也遇到了同样的问题)。

对于 99% 的所有内容,我的扩展 ArrayIterator 的行为类似于一个数组并且运行良好。

不幸的是,implode() 不喜欢被赋予一个 ArrayIterator(或 ArrayObject)。

我无法在文档中发现任何建议通过扩展 ArrayIterator 实现的任何其他类,也找不到任何其他要覆盖的方法。

谁能建议如何让它工作? (注意:每次使用 implode 时都转换为数组不是解决方案,因为我希望这个类似数组的对象完全作为数组工作,并且没有使用它的代码必须知道/关心/转换)

【问题讨论】:

    标签: php implode arrayiterator


    【解决方案1】:

    尝试向下转换数组 ((array) $arrayObject) : implode(",", (array) $arrayObject);

    【讨论】:

    • 小心,强制转换可能会导致意外结果(尤其是在强制转换从其他类继承的对象时)
    • 如果您有兴趣here's more details on casting objects to arrays。还可以使用嵌套对象进行测试...强制转换不是递归的!
    【解决方案2】:

    最简单的正确解决方案是使用iterator_to_arrayimplode,例如

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

    这对于任何可以使用foreach 迭代的东西都可以正常工作。

    【讨论】:

    • 谢谢乔恩。我将把它设置为接受的答案,因为它是一个我不知道的有用功能。但是,这确实要求被调用者知道它不是在处理数组并强制转换它。它很慢,需要额外的代码,并且冒犯了任何人可能有的黑箱想法。希望 PHP 开发人员有朝一日能让所有数组函数接受从 Array 类继承的对象,或者 Array 和类似共享的公共基础。
    • @OliComber:那肯定很好,但坦率地说,这将是一个如此重大的变化,我真的看不到它发生。
    猜你喜欢
    • 2013-07-07
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 2023-02-02
    • 2021-12-19
    • 2012-05-29
    相关资源
    最近更新 更多