Mój kawałek internetu
Kilka dni temu potrzebowałem sposobu na zamianę obiektu SimpleXML na tablicę. Po chwili googlania, okazało się, że wszystkie gotowe już snippety są ogromne i mało wydajne ( głównie przerost formy nad treścią ), więc przedstawiam kilka wersji snippeta:
public function SimpleXml2array ( $xmlObject, $out = array () )
{
foreach ( (array) $xmlObject as $index => $node )
$out[] = ( is_object ( $node ) || is_array ( $node ) ) ? $this -> SimpleXml2array ( $node ) : $node;
return $out;
}
Co Wy na to? Największą robotę załatwia nam tu zwykłe rzutowanie obiektu do tablicy. Kolejnym krokiem jest prosta rekurencja, która sprawdza wszystkie właściwości (dawnego) obiektu i jeśli trafi na tablicę lub kolejny obiekt, powtarza wszystko od początku.
public function SimpleXml2array ( $xmlObject, $out = array () )
{
foreach ( (array) $xmlObject as $index => $node )
{
if ( $index != '@attributes' )
$out[$index] = ( is_object ( $node ) || is_array ( $node ) ) ? $this -> SimpleXml2array ( $node ) : $node;
else
$out[] = ( is_object ( $node ) || is_array ( $node ) ) ? $this -> SimpleXml2array ( $node ) : $node;
}
return $out;
}
Tutaj zmodyfikowana wersja, która zmienia indeks ‘@attributes’ w zawartość nowej tablicy o indeksie 0 (ZERO).
PS. Pierwszy przykład był próbą odtworzenia oryginalnej postaci funkcji na podstawie snippeta nr 2, co czyniłem pisząc tą notkę. Co za tym idzie kod nie był testowany ;-)
Tomasz Kowalczyk
May 16th, 2011 at 20:51
A czy obiekt SimpleXML jest implementuje interfejsu Traversable i nie można go “po prostu” potraktować jako tablicy?
Krzysztof Antczak
June 16th, 2011 at 16:19
Tomku, niestety to nie wystarczy. Powód: Fatal error: Uncaught exception ‘Exception’ with message ‘Serialization of ‘SimpleXMLElement’ is not allowed’. Tak więc owszem, traktujemy obiekt jako tablice, ale najpierw musimy się upewnić, że nigdzie nie występuje SimpleXMLElement w czystej postaci.