Array mit verschiedenen Datentypen extrahieren

serializable

Mitglied
Hallo zusammen,

ich hätte da noch einmal ein mittelschweres Problem. Ich habe ein assoziatives Array aus einer Anwendung, welches aus Objekten , Arrays oder auch einfachen Elementen besteht.

Ich möchte dieses Array nun so extrahieren, dass ein einfaches assoziatives Array mit einzelnen Werten entsteht. Leider scheitere ich an dieser Übung :

Anfang des Arrays zum besseren verständnis:

PHP:
array(1) { ["findXXXGeneralSearchXXX"]=> object(stdClass)#4 (4) { ["event"]=> object(stdClass)#5 (23) { ["action"]=> string(6) "EXPORT" ["attributes"]=> NULL


Mein Ansatz:

Funktion zum durchsuchen des Arrays:

PHP:
private function readArray($array){

$data = "";

	if(is_array($array)){  // ist ein Array.

  	   foreach($array as $vname => $vvalue){ // Auslesen des Arrays

  	      if (is_object($vvalue) ){
  	      	 $data = $this -> getObjectElements($vvalue); //Objekt auslesen
  	      	 unset( $array[$vname]);                              // Element aus Array löschen
  	      	 if (is_array($data))
               $this-> arr =	array_merge($this->arr, $data);  //Arrays zusammenfügen
             else if (is_object($data) OR is_string($data))
               array_push($this->arr, $data); //Element hinzufügen
  	      }
  	      else if (is_array($vvalue)){
  	      	$this-> arr =	array_merge($this->arr, $vvalue);  //Arrays zusammenfügen
  	      	unset( $array[$vname]);                         // Element aus Array löschen
  	      }
  	      else{
  	      	array_push($this->arr, $vvalue); //Element hinzufügen
  	      	unset( $array[$vname]);                       // Element aus Array löschen
  	      }
  	   }//foreach
	}//end if


}//end of function

Diese funktion ist private und wird nun von einer 2. Funktion solange aufgerufen, bis keine Arrays oder Objekte mehr in dem Hauptarray Array vorhanden sind. Mein Hauptarray ist eine Klassenvariable.

Schleifenfunktion:

PHP:
public function extractData(){

	foreach($this ->arr as $vname => $vvalue){

	 	if (is_object($vvalue)or is_array($vvalue))

	 	  $this -> readArray($this -> arr);

	 }

     return $this-> arr;

	

}

Leider sind immernoch Objekte im Array vorhanden. Am Ende dürfen auch keine Einträge doppelt vorkommen, d.h. wenn ich ein Objekt extrahiere, dann muss im Anschluss das extrahierte Element gelöscht werden.

Vielleicht könnte mir hier jemand ein paar Tipps geben.

Danke
 
Moin,

danke schon einmal für die Antwort. Hättest Du meinen Code gelesen, dann wäre Dir sicherlich aufgefallen, dass die is_object() Methode bereits des Öfteren in der Funktion enthalten ist.

Irgendwie scheint mir der richtige Ansatz zu fehlen.
 
Hier ist das Zauberwort "rekursive"

du musst das Array bzw das Object rekursiv durchlaufen.. nur so durchläufst du alle verschachtelten Arrays bzw Objekte
 
Ja Moin,

ich habe also versucht eine rekursive Funktion zu schreiben. Ich habe es insgesamt mit einer eigenen Klasse umgesetzt. Es funktioniert, nichts desto trotz würde ich mich freuen, wenn Ihr mir vielleicht hierzu Eure Meinung leihen könntet:

Ich stelle einmal die komplette Klasse ein:

PHP:
<?php
/*
 * Created on 11.01.2009
 *
 * To change the template for this generated file go to
 * Window - Preferences - PHPeclipse - PHP - Code Templates
 */


class ObjectReader{


	private $ar  = array();  // Array für Datenhaltung während der Auflösung

    // Leerkonstruktor
	function __construct(){}



/**
 *  Funktion wandelt ein Object in ein assoziatives Array um.
 *  @param Object $object
 */
 private function getObjectElements($object){

	if (is_object($object))
         return get_object_vars($object);
         else
         return $object;
 }


/**
 *
 */
public function extractData($daten){


	if (is_array($daten)){ // Wenn Daten ein Array sind.

	   foreach ($daten as $varname => $var){ // Array auslesen

		 if ( is_array($var)){ // ist Array Element ein Array

		    $this -> extractData($var);   //ruft die Funktion noch einmal auf
		 }
		 elseif (is_Object($var)){     // ein Objekt liegt vor.
             $elements = $this -> getObjectElements($var);  // Auslesen des Objektes

             if (is_array($elements)){
          	   $this -> extractData($elements);
          }
		 }
          else{
            array_push($this -> ar, array($this -> ar[$varname] => $var));

          }


          array_unique($this-> ar);


	  }//foreach
    } //is Array


}// end of function


/**
 * Getter Methode für die Rückgabe des Arrays
 */
public function getArr(){
	return $this-> ar;
}



}// end of class

Über Rückmeldungen wäre ich dankbar...
 
Zurück