2013-09-06 8 views
5

ArrayIteratorにはいくつか問題があります(実際、ArrayObjectと同じ問題があります)。ArrayIteratorまたはArrayObjectをimplodeで使用するにはどうすればよいですか?

すべての99%について、私の拡張されたArrayIteratorは配列のように動作し、うまく動作しています。

残念ながら、implode()にはArrayIterator(またはArrayObject)が与えられているのが好きではありません。

拡張されたArrayIteratorで実装する他のクラスやその他のオーバーライドする方法を示唆している場所では、どこにでもドキュメントを見つけることができません。

誰でもこの作業を行う方法を提案できますか? (注:implodeを使用するたびに配列にキャストするのは解決策ではありません。この配列のようなオブジェクトを配列として正確に動作させ、コードを使用してケア/キャストする必要はありません)

答えて

7

最も簡単な正解はimplodeを養うためにiterator_to_arrayを使用することであるが、例えば

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

foreachを繰り返すことができるものと期待されるので、これは動作します。

+1

ありがとうございました。私はそれが私が知らなかった有用な機能であるため、これを受け入れられた答えとして設定します。しかし、これは、呼び出し先が配列を扱っていないことを知っていて、それをキャストすることを必要とします。それは遅く、余分なコードを必要とし、あるかもしれないブラックボクシングのアイデアを嫌う。おそらく、PHP開発者は、すべての配列関数がArrayクラスの子孫オブジェクトを受け入れるようにするか、Arrayやそれに類するものが共有する共通の基底を受け入れることを望むでしょう。 –

+0

@OliComber:それは間違いなく良いだろうが、率直に言って、私は本当にそれが起こって見ることができないような大きな変化であろう。 – Jon

0

配列((array) $arrayObject)をダウンキャストしてみてください。implode(",", (array) $arrayObject);

+3

キャストすると予期しない結果になることがあります(特に他のクラスから継承するオブジェクトをキャストする場合) –

+1

興味がある場合は[オブジェクトを配列にキャストする方法の詳細についてはこちら](http://stackoverflow.com/質問/ 17695490 /キャストオブジェクト対配列異常行動/ 17695596#17695596)。また、ネストされたオブジェクトでこれをテストしてください...キャストは再帰的ではありません! –

関連する問題