2013-09-06 10 views
5

Mam kilka problemów z ArrayIterator (I rzeczywiście, ten sam problem z ArrayObject).Jak mogę sprawić, aby ArrayIterator lub ArrayObject działały z implode?

Dla 99% wszystkiego, mój rozszerzony ArrayIterator zachowuje się jak tablica i działa świetnie.

Niestety, implode() nie lubi, gdy otrzymuje ArrayIterator (lub ArrayObject).

Nie mogę znaleźć w dokumentach w dowolnym miejscu, które sugeruje inne klasy do wdrożenia na rozszerzonym ArrayIterator, ani żadnych innych metod do przesłonięcia.

Czy ktoś może zasugerować, jak to działa? (Uwaga: Przesyłanie do tablicy za każdym razem, gdy używam implodu, nie jest rozwiązaniem, ponieważ chciałbym, aby ten obiekt podobny do tablicy działał DOKŁADNIE jako tablica i nie używał kodu, aby go znać/opiekować/rzutować)

Odpowiedz

7

Najprostszym poprawne rozwiązaniem jest użycie iterator_to_array karmić implode, np

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

To będzie działać zgodnie z oczekiwaniami z niczego, że można powtórzyć z foreach.

+1

Dzięki Jon. Ustawię to jako akceptowaną odpowiedź, ponieważ jest to przydatna funkcja, której nie znałem. Wymaga to jednak, aby osoba przekazująca wiedziała, że ​​nie ma do czynienia z tablicą i ją rzuca. Jest powolny, wymaga dodatkowego kodu i obraża wszelkie pomysły black boxingu. Mam nadzieję, że twórcy PHP pewnego dnia sprawią, że wszystkie funkcje tablicowe przyjmą obiekty wywodzące się z klasy Array, lub wspólną bazę, która Array i podobne akcje. –

+0

@OliComber: Byłoby to zdecydowanie miłe, ale szczerze mówiąc, byłaby to tak wielka zmiana, że ​​naprawdę nie mogę tego zobaczyć. – Jon

0

spróbować rzutowanie w dół tablicy ((array) $arrayObject): implode(",", (array) $arrayObject);

+3

Ostrożnie, odlew może prowadzić do nieoczekiwanych wyników (szczególnie gdy podczas rzucania obiekt, który dziedziczy z innych klas) –

+1

W przypadku jesteś zainteresowany [oto więcej szczegółów na temat rzucania obiektów do tablic] (http://stackoverflow.com/ pytania/17695490/cast-object-to-array-strange-behavior/17695596 # 17695596). Przetestuj to także z zagnieżdżonymi obiektami ... rzuty nie są rekurencyjne! –

Powiązane problemy