[PHP] Array umstellen?

fragger1991

New Member
Hallo,

kleines Problem, meine API Formatiert mir meinen Daten ziemlich behindert, weiss der Teufel warum...

Nun, wie bekomme ich das Array:
PHP:
SimpleXMLElement Object
(
    [userid] => Array
        (
            [0] => test@test1
            [1] => dfhfd@test2
        )

    [homedir] => Array
        (
            [0] => /home/test/test_6
            [1] => /home/test/test_7
        )

    [count] => Array
        (
            [0] => 0
            [1] => 0
        )

    [accessed] => Array
        (
            [0] => 0000-00-00 00:00:00
            [1] => 0000-00-00 00:00:00
        )

    [modified] => Array
        (
            [0] => 0000-00-00 00:00:00
            [1] => 0000-00-00 00:00:00
        )

    [enabled] => Array
        (
            [0] => 1
            [1] => 1
        )

    [ip] => Array
        (
            [0] => 127.0.0.1
            [1] => 127.0.0.1
        )

)

In das Format gewandelt?

PHP:
SimpleXMLElement Object
(
    [0] => Array
        (
            [userid] => test@test1
            [homedir] => /home/test/test_6
            [count] => 0
            [accessed] => 0000-00-00 00:00:00
            [modified] => 0000-00-00 00:00:00
            [enabled] => 1
            [ip] => 127.0.0.1
        )
    [1] => Array
        (
            [userid] => dfhfd@test2
            [homedir] => /home/test/test_7
            [count] => 0
            [accessed] => 0000-00-00 00:00:00
            [modified] => 0000-00-00 00:00:00
            [enabled] => 1
            [ip] => 127.0.0.1
        )
)

Hab nun schon ne weile mit Verschiedenen Methoden versucht das ganze zu Lösen, aber nunja, bin gescheitert.

Ich hoffe hier hat jemand ne bessere Idee :D

Vielen Dank!
 
Zuallererst; es ist kein Array sondern ein Object.
Beide werden jeweils anders gehandhabt, lassen sich aber durch typecasting in das jeweilige Gegenstueck umwandeln.

PHP:
<?php
$array = array();
foreach($object as $key=>$subobject) {
   foreach($subobject as $count=>$value) {
      $array[$count][$key] = $value;
   }
}
?>
Wie ueblich; ungetestet sollte aber funktionieren ;)
 
Naja für mich ist das irgendein Pseudo- dingen, ich finde nicht das es sich wie ein Objekt verhält :D

Dein Code klappt leider nicht.

Ein print_r von $subobject in der 2ten Schleife bringt kein Ergebnis, ein print_r innerhalb der ersten bringt das:

PHP:
SimpleXMLElement Object
(
    [0] => test@test1
)
SimpleXMLElement Object
(
    [0] => /home/test/test_6
)
SimpleXMLElement Object
(
    [0] => 0
)
SimpleXMLElement Object
(
    [0] => 0000-00-00 00:00:00
)
SimpleXMLElement Object
(
    [0] => 0000-00-00 00:00:00
)
SimpleXMLElement Object
(
    [0] => 1
)
SimpleXMLElement Object
(
    [0] => 127.0.0.1
)
SimpleXMLElement Object
(
    [0] => dfhfd@test_9
)
SimpleXMLElement Object
(
    [0] => /home/test/test_7
)
SimpleXMLElement Object
(
    [0] => 0
)
SimpleXMLElement Object
(
    [0] => 0000-00-00 00:00:00
)
SimpleXMLElement Object
(
    [0] => 0000-00-00 00:00:00
)
SimpleXMLElement Object
(
    [0] => 1
)
SimpleXMLElement Object
(
    [0] => 127.0.0.1
)
 
Klar :D

Code:
<ftplist><userid>test@test1</userid><homedir>/home/test/test_6</homedir><count>0</count><accessed>0000-00-00 00:00:00</accessed><modified>0000-00-00 00:00:00</modified><enabled>1</enabled><ip>127.0.0.1</ip><userid>dfhfd@test_9</userid><homedir>/home/test/test_7</homedir><count>0</count><accessed>0000-00-00 00:00:00</accessed><modified>0000-00-00 00:00:00</modified><enabled>1</enabled><ip>127.0.0.1</ip></ftplist>
 
Ich mag das Zwitterwesen zwischen Object und Weiss-gott-was auch nicht sonderlich und das ist auch der einzige Grund warum es nicht funktionierte ;)
Mit einer kurzerhand gebastelten rekursiven Typecast-Funktion gehts dann auch =)

PHP:
<?php
$xml = "<XMLSTRING HIER>"

$xml = simplexml_load_string($xml);
function object2array($obj) {
  $obj = (array)$obj;
  foreach($obj as $key=>$value) {
    if(is_object($value)) $obj[$key] = object2array($value);
  }
  return $obj;
}

$xml = object2array($xml);

$array = array();
foreach($xml as $key=>$subobject) {
  foreach($subobject as $count=>$value) {
    $array[$count][$key] = $value;
  }
}

var_dump($array);
?>
Nicht grade das sauberste aber es funktioniert :cool:
 
Ach du meine Fresse :D

Ich danke dir recht herzlich, damit klappt es tatsächlich :D

Das es auch immer so Kompliziert sein muss ^^
 
Wenn es einfach waere koennte jeder programmieren[*] und ich haette meine Ruhe :P


[*] Jeder halbwegs technisch/logisch angehauchte Mensch kann programmieren, nur haben die meisten entweder nicht die Motivation oder die Zeit dazu...
 
Also ich finde Programmieren ja toll =)

Es macht wirklich Spaß zu sehen was man so alles machen kann, und der anblick das es Funktioniert. Man sieht einfach was man geschafft hat :D

Klar ab und an hängt man mal, wie hier bei diesem Objekt sonst-was Dingen, aber man lernt einfach daraus :D
 
Ohh d4f welche wahre Worte :D

Ich habe gerade nen Fehler festgestellt, dein Code macht Massenverarbeitung ja ziemlich gut, aber 1 Datensatz schafft es nicht :D

Gerade ne Idee woran das liegt? Ohne Codeänderung, bei 2 Datensätzen klappt es, bei einem nicht.

Code:
Warning: Invalid argument supplied for foreach() in /var/www/xxx/functions.php on line 355

Line 355:
PHP:
foreach($subobject as $count=>$value) {

PHP:
	function object2array($obj) {
		$obj = (array)$obj;
		foreach($obj as $key=>$value) {
			if(is_object($value)) $obj[$key] = object2array($value);
		}
  		return $obj;
	}

	$xml = object2array($obj);

	$array = array();
	foreach($xml as $key=>$subobject) {
/*Diese Zeile*/
  		foreach($subobject as $count=>$value) {
/*Diese Zeile*/
			$array[$count][$key] = $value;
  		}
	}

	return $array;
 
Dann ist dein Subobjekt kein Subobjekt sondern ein Feld (value)
Diesen Sonderfall hatte ich, von deinem anfaenglichen XML-Code ausgehend, nicht beruecksichtigt.

Beachte dass Leerzeichen zwischen 2 XML-Tags auch als Value bezeichnet werden.

Ich kann es aber gern umbauen ^^
 
Eine einfache Prüfung, ob es sich dabei eventuell nur um einen einzigen Value handelt, sollte sich ja recht schnell implementieren lassen.
 
Ahh, alles klar :D

Danke, habe es nun so gelöst:

PHP:
	foreach($xml as $key=>$subobject) {
		if(is_string($subobject)) {
			$array[0][$key] = $subobject;
		} else {
			foreach($subobject as $count=>$value) {
				$array[$count][$key] = $value;
  			}
		}
	}

Wie hättet ihr es gemacht? ^^
 
Wie weisst du sicher ob er zu 0 gehoert?
Ich wuerde es in eine einzelne Kategorie werfen

PHP:
foreach($xml as $key=>$subobject) { 
       if(!is_object($subobject)) {
          $subobject = trim($subobject);
          if(empty($subobject)) continue; //make sure it's really contant
          $array['invalid'][$key] = $subobjekt;
       }
       else { 
            foreach($subobject as $count=>$value) { 
                $array[$count][$key] = $value; 
              } 
        } 
    }
 
PHP:
foreach($xml as $key=>$subobject) { 
       if(!is_object($subobject)) {
          $subobject = trim($subobject);
          if(empty($subobject)) continue; //make sure it's really contant
          $array['invalid'][$key] = $subobject;
       }
       else { 
            foreach($subobject as $count=>$value) { 
                $array[$count][$key] = $value; 
              } 
        } 
    }

statt:
PHP:
$array['invalid'][$key] = $subobjekt;

das:
PHP:
$array['invalid'][$key] = $subobject;

Das Ergebnis:
PHP:
Array ( [invalid] => Array ( [id] => Array [userid] => Array [homedir] => Array [count] => Array [accessed] => Array [modified] => Array [enabled] => Array [ip] => Array ) )

Wissen kann ich es natürlich nicht, aber fremde Daten werden auch nicht abgerufen und den Input bestimmte immer noch ich :D
 
Back
Top