Uchwycić moment…

menic’s devBlog

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:
  1. <?php
  2. /**
  3. * Dokonuje konwersji z object na array rekursywnie
  4. *
  5. * @param object $z
  6. * @return aray
  7. */
  8. function objToArray(&$z)
  9. {
  10. if( is_array( $z ) )
  11. {
  12. foreach( $z as $k=>$v )
  13. {
  14. if( is_object( $z[$k] ) )
  15. {
  16. $z[$k] =(array)$v;
  17. $z[$k] = objToArray( $z[$k] );
  18. }
  19. }
  20. }
  21. else
  22. {
  23. settype( $z, 'array' );
  24. objToArray( $z );
  25. }
  26. return $z;
  27. }
  28. ?>

16 Comments so far

  1. sopel maj 23rd, 2007 8:33 am

    czym to się różni od (array)$object ?

  2. menic maj 23rd, 2007 9:38 am

    @sopel: Sprawdz ;)

  3. jaco maj 23rd, 2007 5:32 pm

    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!

  4. menic maj 23rd, 2007 7:46 pm

    Z ciekawosci sprawdzilem i... parsowanie simplexml jesto wolniejsze ;) Nastraszyles mnie :P

  5. medyk maj 23rd, 2007 9:44 pm

    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.

  6. menic maj 24th, 2007 7:53 am

    @medyk: serializuje do xmla? Co miales na mysli?

  7. Elf maj 24th, 2007 9:24 am

    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ę?

  8. menic maj 24th, 2007 9:28 am

    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.

  9. medyk maj 24th, 2007 3:53 pm

    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.

  10. menic maj 24th, 2007 6:18 pm

    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 :)

  11. medyk maj 24th, 2007 8:08 pm

    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.

  12. menic maj 24th, 2007 8:14 pm

    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']

  13. medyk maj 24th, 2007 11:39 pm

    A dla czego używasz tej tablicy a nie obiektu? Co jest złego czy nie wygodnego w korzystaniu z obiektu?

  14. menic maj 24th, 2007 11:45 pm

    Nic nie jest złego, tym bardziej niewygodnego. Ale jedyny plus to to ze oszczedzam parsowania pliku xml przy kazdym wywołaniu strony.

  15. medyk maj 25th, 2007 1:28 am

    ile czasu zaoszczędzasz na wywołaniu.. a ile tracisz na pisaniu wywróconego do góry nogami kodu?

  16. menic maj 25th, 2007 1:33 am

    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 [] :)

Leave a reply

Mexico