Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [simpleXML] funkcja obj2array zle dziala
Forum PHP.pl > Forum > PHP > Object-oriented programming
aleksander
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?
hwao
Tzn ze klucza nie ma na poczatku actions? to da sie latwo dorobic przecierz snitch.gif
aleksander
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
cobyl
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.
Vengeance
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
aleksander
na forum algorytmy/klasy/funkcje mam dwie funkcje ktore rozwiazuja moj blad, moze Tobie Venegance sie przydadza.
Vengeance
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. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.