Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]zapis unikalnych zmiennych z obiektu
Forum PHP.pl > Forum > Przedszkole
wpaski
Witam, mam taki przykładowy obiekt klasy SimpleXMLElement:
  1. objectclass SimpleXMLElement#6 (18) {
  2. public $typ_czegos =>
  3. string(4) "przykladowy typ"
  4. public $id =>
  5. string(7) "1234567"
  6. public $id_planety =>
  7. string(1) "1"
  8. public $miasto =>
  9. string(10) "Warszawa"
  10. public $adres =>
  11. class SimpleXMLElement#7 (0) {
  12. }
  13. public $images =>
  14. class SimpleXMLElement#8 (1) {
  15. public $image =>
  16. array(5) {
  17. [0] =>
  18. string(55) "1.jpg"
  19. [1] =>
  20. string(55) "2.jpg"
  21. [2] =>
  22. string(55) "3.jpg"
  23. [3] =>
  24. string(55) "4.jpg"
  25. [4] =>
  26. string(55) "5.jpg"
  27. }
  28. }
  29. public $gtestowa =>
  30. class SimpleXMLElement#9 (2) {
  31. public $x =>
  32. string(11) "0.4"
  33. public $y =>
  34. string(11) "16"
  35. }
  36. }


Jak widać w klasie są zmienne różnego typu(string,int,array)
W jaki sposób przelecieć pętlą po takim obiekcie i zapisać do pliku każdą unikalną nazwę węzła? (chodzi mi o to jak zrobić samą pętlę o zapis nie pytam)
Jak to zrobić dla wszystkich węzłów, podejrzewam, że trzeba użyć rekurencji ale jak?

W taki sposób wypisuję węzły które nie są zagnieżdzone:
  1. foreach ($simpleXML->children() as $child)
  2. {
  3. echo $child->getName() . "\n";
  4. }

Daimos
Miliony sposobów, miliony tutoriali grzebania w xmlach smile.gif pierwszy wynik z googla:
http://www.binarytides.com/convert-simplex...o-array-in-php/
i masz tam z 10 sposobów na to.
Inny przykład z użyciem RecursiveIteratorIterator (chyba drugi wynik, stackoverflow):
  1. $source = '
  2. <api>
  3. <stuff>ABC</stuff>
  4. <things>
  5. <thing>DEF</thing>
  6. <thing>GHI</thing>
  7. <thing>JKL</thing>
  8. </things>
  9. </api>
  10. ';
  11.  
  12. $xml = new SimpleXMLIterator($source);
  13. $iterator = new RecursiveIteratorIterator($xml);
  14. foreach ($iterator as $element) {
  15. // Use array-style syntax to write new text to the element
  16. $element[0] = strrev($element);
  17. }
  18. echo $xml->asXML();
by_ikar
get_object_vars ?
wpaski
wiem, że jest mnóstwo przykładów ale mi chodziło o taki który spełnia to co ja chcęsmile.gif ten który podałeś nie spełniał, bo mi nie chodziło o wartości tylko o klucze(zmienne w obiekcie SimpleXML), a w przypadku zmiany
  1. foreach ($iterator as $element) {

na
  1. foreach ($iterator as $key => $element) {

pomijane były klucze np. things w tym wypadku



moje rozwiązanie:
  1.  
  2. private function list_node($node) {
  3. foreach ($node->children() as $key => $child)
  4. {
  5. if ($child->children())
  6. {
  7. $this->list_node($child);
  8. }
  9. }
  10. }

tak czy siak dzięki, problem rozwiązany.
Daimos
Przecież dokładnie to samo miałeś w linku, który Ci podałem:
  1. function xml2array ( $xmlObject, $out = array () )
  2. {
  3. foreach ( (array) $xmlObject as $index => $node )
  4. {
  5. $out[$index] = ( is_object ( $node ) ) ? xml2array ( $node ) : $node;
  6. }
  7. return $out;
  8. }

Poza tym poniższy kod, z samego początku, tworzy tablicę z kluczami, którą możesz wykorzystać w banalny sposób:
  1. <?php
  2.  
  3. $xml = '<?xml version="1.0" encoding="UTF-8"?>
  4. <resultset>
  5. <row>
  6. <name>Happy</name>
  7. <age>20</age>
  8. </row>
  9. <row>
  10. <name>Harry</name>
  11. <age>25</age>
  12. </row>
  13. </resultset>';
  14.  
  15. $simple = simplexml_load_string($xml);
  16.  
  17. $arr = json_decode( json_encode($simple) , 1);
  18.  
  19. print_r($arr);
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.