ObjectToArray()
Kiedys chciałem napisac klase do cache'owania obiektow simplexml. Jednak jak sie okazało w praktyce, jest to niemozliwe. To co mnie trzymało przy simplexml to wygoda dostepu do danych w nim zawartych. Napisałem, wiec sobie mala funkcje przeksztalcajaca obiekt w wielowymiarowa tablice. Wygoda praktycznie taka sama jak przy obiekcie, a dodatkowo mozemy calosc ladnie poddac serializacji :)
Tararam:
PHP:
-
<?php
-
/**
-
* Dokonuje konwersji z object na array rekursywnie
-
*
-
* @param object $z
-
* @return aray
-
*/
-
function objToArray(&$z)
-
{
-
{
-
foreach( $z as $k=>$v )
-
{
-
{
-
$z[$k] = objToArray( $z[$k] );
-
}
-
}
-
}
-
else
-
{
-
objToArray( $z );
-
}
-
return $z;
-
}
-
?>
16 Comments so far
Leave a reply
czym to się różni od (array)$object ?
@sopel: Sprawdz ;)
Pytanie po co - zobacz ile trwa zaladowanie pliku xml via simplexml a ile unserialize (tez z pliku). Moje testy wykazaly, ze simplexml dziala conajmniej tak samo... conajmniej!
Z ciekawosci sprawdzilem i... parsowanie simplexml jesto wolniejsze ;) Nastraszyles mnie :P
Jak dla mnie to zupełnie pod górkę - obiekty SimpleXML serializujesz do XML'a i po sprawie.. nawet jeśli Twoje rozwiązanie jest śladowo szybsze (choć nie chce mi się w to wierzyć) to jest po prostu nie logiczne i nie praktyczne.
@medyk: serializuje do xmla? Co miales na mysli?
medykowi chodziło zapewne o to, że możesz zapisywać plik .xml do cache. Tym samym podważa sens cachowania plików xml - dobrze wnioskuję?
Jezeli o to, to nie dziala. Juz o tym pisalem
http://www.menic.info/2007/04/03/unserialize-i-simplexml-object/
Obiekt simplexml mozna poddac serializacji, ale juz w druga strone nie jest to mozliwe, czyli nie da sie odczytac danych.
Może nie właściwie użyłem słowa 'serializacja'.
Jaka jest w ogóle idea serializacji? Chodzi po prostu o to by móc wszystkie dane zawarte w typie złożonym (takim jak obiekt czy tablica) zachować w typie prostym (ciąg znaków).. przede wszystkim w celu przechowania obiektu pomiędzy wywołaniami (ciężko mi sobie wyobrazić inny przypadek użycia).
Tak naprawdę funkcje serialize i unserialize mają nam pomóc jedynie w przenoszeniu obiektów.
SimpleXML jest natywnym obiektem PHP i przez to nie podlega serializacji... ale(!) czym jest obiekt SimpleXML? Jest obiekt osadzony na drzewie XML, który ma nam ułatwić poruszanie się po nim. Jedynymi jego danymi jest drzewo XML.. aby móc je zachować w trybie prostym wystarczy je zapisać do XML'a.
Ale z racji ze xml nie jest typem wbudowanym w php jak np. tablice to trzeba go parsowac. Parsowanie tego bedzie wolniejsze niz odserializowanie tablicy. I o to mi cały czas chodzi :)
Wytłumacz jeszcze raz czemu ma służyć ta tablica? mi wygląda na to totalnie bez użyteczną.. przecież z tablicy nie odtworzysz obiektu SimpleXML - chyba, że napiszesz podobną funkcję do tej powyżej.. ale to wszystko jest po prostu nie logiczne i na pewno jest dużo wolniejsze niż zapisywanie i ładowanie bezpośrednio z XML'a.
Chodzi Ci tylko o serializacje (możliwość przechowania obiektu pomiędzy wywołaniami)? Jeśli tak to te dwie linijki to robią:
$xmlstr = $sxml->asXML();
$sxml = new SimpleXMLElement($xmlstr);
I choćby nie wiem jak wymyślne byłyby funkcje, które będą zmieniać obiekt na tablicę, tablicę na ciąg znaków i w drugą stronę to będą wolniejsze.. tego nawet nie trzeba sprawdzać.. zawsze kod php jest wolniejszy od tego co oferują natywne funkcje php.
Chyba sie nie zrozumielismy. Ja zamieniam obiekt na tablice i tak juz zostaje. W skrypcie zamiast uzywac obiektu simplexml uzywam tablicy zrobionej na podstawie tego obiektu. Czyli np.
$tablica['dziecko']['inne']['@atributes']['name'] jest rownowazne
$obiekt->dziecko->inne['name']
A dla czego używasz tej tablicy a nie obiektu? Co jest złego czy nie wygodnego w korzystaniu z obiektu?
Nic nie jest złego, tym bardziej niewygodnego. Ale jedyny plus to to ze oszczedzam parsowania pliku xml przy kazdym wywołaniu strony.
ile czasu zaoszczędzasz na wywołaniu.. a ile tracisz na pisaniu wywróconego do góry nogami kodu?
Ten kod nie jest wcale wywrocony. Zobacz na przyklad ktory podalem wczesniej. Roznica jest nie wielka i tylko kwestia przestawienia sie ze strzałki -> na tablice [] :)