2013-09-06 21 views
5

ArrayIterator ile birkaç sorun yaşıyorum (Ve aslında ArrayObject ile aynı sorun).ArrayIterator veya ArrayObject'i çürümeyle nasıl çalıştırabilirim?

Her şeyin% 99'u için, genişletilmiş ArrayIterator'ım bir dizi gibi davranır ve harika çalışıyor.

Ne yazık ki, implode() bir ArrayIterator (veya ArrayObject) verilmekten hoşlanmaz.

Dokümanlarda, herhangi bir başka sınıfın, genişletilmiş ArrayIterator tarafından uygulanmasını öneren herhangi bir yere ya da geçersiz kılma yöntemlerine rastlayamıyorum.

Bu çalışmayı nasıl gerçekleştirebileceğinizi öneren var mı? (Not: Her dizi kullandığımda bir diziye dökmek bir çözüm değil, bu dizi gibi bir nesne bir dizi olarak EXACTLY çalışmasını istedim ve bunu bilmek/bakım/döküm yapmak için kodu kullanmamak gibi) dizi ((array) $arrayObject) downcasting

cevap

7

kolay doğru çözüm, örneğin implode beslemek için iterator_to_array kullanmaktır

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

Bu foreach ile iterated şeyle beklendiği gibi çalışır.

+1

Teşekkürler Jon. Bunu kabul edilen cevap olarak ayarlayacağım çünkü bilmediğim kullanışlı bir işlev. Ancak bu, callee'nin bir dizi ile uğraşmadığını ve onu atlattığını bilmesini gerektirir. Yavaştır, ekstra kod gerektirir ve kara kutunun sahip olabileceği herhangi bir fikri bozar. Umarım PHP devleri, bir gün tüm dizi işlevlerini Array sınıfından türeyen nesneleri veya Array ve benzer paylaşımın ortak bir temelini kabul eder. –

+0

@OliComber: Bu kesinlikle hoş olurdu, ama açıkçası böyle bir büyük değişiklik olacağını gerçekten göremiyorum. – Jon

0

deneyin: implode(",", (array) $arrayObject);

+3

Dikkatli, döküm beklenmedik sonuçlara yol açabilir (özellikle, başka sınıflardan miras alınan bir nesneyi döküldüğünde) –

+1

İlgilendiğiniz takdirde [burada nesnelerin dizilere dökülmesiyle ilgili daha fazla bilgi] (http://stackoverflow.com/ sorular/17695490/dökme nesne-dizi-garip-davranış/17695596 # 17695596). Ayrıca bunu iç içe geçmiş nesnelerle test edin ... oyuncular tekrarlayıcı değil! –

İlgili konular