Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [simpleXML] funkcja obj2array zle dziala
aleksander
post 13.01.2005, 17:44:50
Post #1





Grupa: Przyjaciele php.pl
Postów: 742
Pomógł: 0
Dołączył: 14.12.2003
Skąd: Gdańsk, Trójmiasto

Ostrzeżenie: (0%)
-----


witam,

Na php.net znalazłem funkcję która konwertuje obiekt simplexml do tablicy:
  1. <?php
  2. function recursive_obj2array( $obj )
  3. {
  4. $subject_array = array();
  5.  foreach ((array) $obj as $key => $var)
  6.  {
  7.  if (is_object($var))
  8.  {
  9.  if(count((array) $var) == 0)
  10.  {
  11.  $subject_array[$key] = 'NULL';
  12. }
  13. else
  14. {
  15. recursive_obj2array($var );
  16. }
  17. }
  18. else
  19. {
  20. $subject_array[$key] = $var;
  21. }
  22. }
  23. return $subject_array;
  24. }
  25.  
  26. echo '<pre>';
  27. print_r( recursive_obj2array( simplexml_load_file('xml.xml') ) );
  28. echo '</pre>'; 
  29. ?>
Niestety dla takiego xmlu:
  1. <actions>
  2.    <action>
  3.      <default>true</default>
  4.      <name>main</name>
  5.      <requiredRoles>viewNews</requiredRoles>
  6.      <type>view</type>
  7.      <matches>main</matches>
  8.      <fallback>accessDenied</fallback>
  9.    </action>
  10.  
  11.    <action>
  12.      <name>footer</name>
  13.      <requiredRoles>viewNews</requiredRoles>
  14.      <type>view</type>
  15.      <matches>null</matches>
  16.      <fallback>accessDenied</fallback>
  17.    </action>
  18. </actions>
wychodzi zly kod, bo z obiektem:
Cytat
Array
(
    [action] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [default] => true
                    [name] => main
                    [requiredRoles] => viewNews
                    [type] => view
                    [matches] => main
                    [fallback] => accessDenied
                )

            [1] => SimpleXMLElement Object
                (
                    [name] => footer
                    [requiredRoles] => viewNews
                    [type] => view
                    [matches] => null
                    [fallback] => accessDenied
                )

        )

)
Nie wiem jak to naprawić, bo zamiast obiektu powinna byc kolejna tablica sad.gif Może mi ktoś pomóc?

Ten post edytował olo 13.01.2005, 18:03:26
Go to the top of the page
+Quote Post
hwao
post 13.01.2005, 18:00:22
Post #2


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




Tzn ze klucza nie ma na poczatku actions? to da sie latwo dorobic przecierz snitch.gif
Go to the top of the page
+Quote Post
aleksander
post 14.01.2005, 23:24:07
Post #3





Grupa: Przyjaciele php.pl
Postów: 742
Pomógł: 0
Dołączył: 14.12.2003
Skąd: Gdańsk, Trójmiasto

Ostrzeżenie: (0%)
-----


witam,

doszedłem już czemu to nie działa. Napisałem własny konwerter obj=>arr:
  1. <?php
  2. $obiekty = array();
  3. function xml2array( $obj )
  4. {
  5. global $obiekty;
  6.  
  7. foreach( (array)$obj as $key => $val )
  8. {
  9. if( is_object( $val ) )
  10. {
  11. xml2array( $val );
  12. }/*
  13. elseif( is_array( $val ) )
  14. {
  15. xml2array( $val );
  16. }*/
  17. else
  18. {
  19. $obiekty[$key] = $val;
  20. }
  21. }
  22. }
  23. ?>

teraz dwa listtingi: pierwszy to var_dump obiektu simplexml, drugi to wynik działania funkcji na tym obiekcie:
Cytat
object(SimpleXMLElement)#1 (1) {
  ["action"]=>
  array(2) {
    [0]=>
    object(SimpleXMLElement)#4 (6) {
      ["default"]=>
      string(4) "true"
      ["name"]=>
      string(4) "main"
      ["requiredRoles"]=>
      string(8) "viewNews"
      ["type"]=>
      string(4) "view"
      ["matches"]=>
      string(4) "main"
      ["fallback"]=>
      string(12) "accessDenied"
    }
    [1]=>
    object(SimpleXMLElement)#5 (5) {
      ["name"]=>
      string(6) "footer"
      ["requiredRoles"]=>
      string(8) "viewNews"
      ["type"]=>
      string(4) "view"
      ["matches"]=>
      string(4) "null"
      ["fallback"]=>
      string(12) "accessDenied"
    }
  }
}
Cytat
Array
(
    [action] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [default] => true
                    [name] => main
                    [requiredRoles] => viewNews
                    [type] => view
                    [matches] => main
                    [fallback] => accessDenied
                )

            [1] => SimpleXMLElement Object
                (
                    [name] => footer
                    [requiredRoles] => viewNews
                    [type] => view
                    [matches] => null
                    [fallback] => accessDenied
                )

        )

)
Podczas pierwszej rekurencji funkcja widzi TYLKO tablice, więc nie wchodzi do tej tabicy, dlatego w srodku pozostają obiekty. Zakomentowałem sposób w jaki chciałem to ominąc, niestety on nie działa. TerazCzy ktoś wie jak to naprawić smile.gif questionmark.gif
Go to the top of the page
+Quote Post
cobyl
post 4.02.2005, 06:50:05
Post #4





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 28.09.2004
Skąd: warszawa a czasem okolice

Ostrzeżenie: (0%)
-----


hm, problem ten też mnie nurtował, wymyśliłem coś takiego, opartego
na wskaźnikach:

  1. <?php
  2.  
  3. function xml2array( $obj, $parent )
  4. {
  5. foreach( (array)$obj as $key => $val )
  6. {
  7. if( is_object( $val ) )
  8. {
  9. xml2array( $val , &$parent[$key] );
  10. }
  11. elseif( is_array( $val ) )
  12. {
  13. foreach ($val as $key2 => $child)
  14. {
  15. xml2array( $child , &$parent[$key][$key2]);
  16. }
  17. }
  18. else
  19. {
  20. $parent[(string)$key] = $val;
  21. }
  22. }
  23.  
  24. }
  25. $obiekty = array();
  26. xml2array($objekt_z_xlmlem,&$obiekty);
  27.  
  28. var_dump($obiekty)
  29.  
  30. ?>


jako że wymyśliłem ja to 1,5h temu więc może są jakieś błedy jakich
nie dostrzegam winksmiley.jpg i pewnie można to "uładnić", ale chyba(?) sama idea jest git.

ps. a tak wogóle to mówie wszystkim dzień dobry bo to mój pierwszy na forum php.pl post.
Go to the top of the page
+Quote Post
Vengeance
post 6.02.2005, 21:09:10
Post #5





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

Ostrzeżenie: (0%)
-----


cholera nie ma porzadnej funkcji tego typu.
potrzeba mi czegos co obsluguje atrybuty tagu :/

na php.net jest jakas ale przy moim xml-u (czyt. ciut bardziej zagniezdzonym) sie sypie sad.gif]

ma ktos moze cos gotowego ? sad.gif


--------------------
Go to the top of the page
+Quote Post
aleksander
post 7.02.2005, 15:02:15
Post #6





Grupa: Przyjaciele php.pl
Postów: 742
Pomógł: 0
Dołączył: 14.12.2003
Skąd: Gdańsk, Trójmiasto

Ostrzeżenie: (0%)
-----


na forum algorytmy/klasy/funkcje mam dwie funkcje ktore rozwiazuja moj blad, moze Tobie Venegance sie przydadza.
Go to the top of the page
+Quote Post
Vengeance
post 7.02.2005, 18:27:46
Post #7





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

Ostrzeżenie: (0%)
-----


Hmm watpie... ale przerobilem jedna z funkcji na php.net

Zmiana umozliwia stosowanie takiej konstrukcji:
Kod
<root>
   <param arg1="aaa" arg2="bbb" />
   <param arg1="aaa2" arg2="bbb2" />
</root>


Wczesniej funkcja nie zwracala uwagi na argumenty.
  1. <?php
  2. /**
  3.  * Konwertuje SimpleXMLElement object do tablic
  4.  * Na podstawie: php.net/simplexml
  5.  * Kod autorstwa Daniel FAIVRE 2005 - www.geomaticien.com
  6.  * Modyfikacje: Vengeance
  7.  * Copyleft GPL license
  8.  */
  9. function simplexml2array($xml) {
  10.  if (get_class($xml) == 'SimpleXMLElement') {
  11.  $attributes = $xml->attributes();
  12.  foreach($attributes as $k=>$v) {
  13.  if ($v) $a[$k] = (string) $v;
  14.  }
  15.  $x = $xml;
  16.  $xml = get_object_vars($xml);
  17.  }
  18.  if (is_array($xml)) {
  19.  // - poprawione - //
  20.  if(count($xml) == 0)
  21.  {
  22. if(count($a) <> 0)
  23.  return $a;
  24. return (string) $x;
  25.  }
  26.  // - koniec poprawki - //
  27.  foreach($xml as $key=>$value) {
  28.  $r[$key] = simplexml2array($value);
  29.  }
  30.  if (isset($a)) $r['@'] = $a; // Attributes
  31.  return $r;
  32.  }
  33.  return (string) $xml;
  34. }
  35. ?>


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 29.06.2025 - 21:38