Array zu einem Objekt konvertieren

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Array zu einem Objekt konvertieren

    Hallo all!

    Ich habe ein Array in folgender Form vorliegen.

    Code:
    Array
    (
        [resources] => Array
            (
                [db] => Array
                    (
                        [class] => PDO
                        [adapter] => mysql
                        [host] => localhost
                        [user] => root
                        [pwd] => null
                        [dbname] => wendt
                        [charset] => utf8
                    )
    
                [files] => Array
                    (
                        [images] => public/images/
                    )
    
                [plugins] => Array
                    (
                        [acl] => Acl
                        [auth] => Auth
                    )
    
            )
    
        [languages] => Array
            (
                [de] => de
                [en] => en
                [fr] => fr
            )
    
    )
    Dieses merhdimensionale Array möchte ich nun zu einem Objekt konvertieren.

    Mein Ziel ist es dann so etwas zu haben.
    PHP-Code:
    $config->resources->db->class
    Hier meine Config.php Klasse. Die ist noch nicht fertig da kommt noch bisschen was dazu, es geht nur um den Teil hier bzw. das Problem.

    PHP-Code:
    <?php
    require_once LIB_PATH 'Config/ConfigException.php';

    class 
    Config
    {
        protected 
    $_file;
        protected 
    $_config;
        protected 
    $_configClass;
        protected 
    $_data = array();
        protected 
    $_configPath;
        
        public function 
    __construct($pPath$value null)
        {
            
    $this->_configPath $pPath;
            
    $this->_loadConfigFile();
            
    $this->getConfigFile();
            
    $this->getConfigClass();
            
    $array $this->_configClass->container();
            
            foreach(
    $array as $key => $value) {
                
                if(
    is_array($value)) {
                    
    $this->_data[$key] = new self($this->_configPath$value);
    //                $this->_data[$key] = $value;
                

                else {
                    
    $this->_data[$key] = $value;
                }
            }
            
    //echo '<pre>';
            //    print_r($array);
            //echo '</pre>';
        
    }
        
        public function 
    __set($name$value)
        {
            if(
    is_array($value)) {
                
    $this->_data[$name] = new self($this->_configPath$value);
            } else {
                
    $this->_data[$name] = $value;
            }
        }
        
        public function 
    __get($name)
        {
            return 
    $this->_data[$name];
        }
        
        protected function 
    _loadConfigFile()
        {
            if(
    is_dir($this->_configPath)) {
                
                try {
                    
                    if(
    $resource opendir($this->_configPath)) {
                        
                        while((
    $file readdir($resource)) !== false ) {
                            
                            if(
    $file != '.' && $file != '..' && $file != 'thumb') {
                                
    $this->_file substr(strrchr($file'.'), 1);;
                            }
                        }
                    }
                } catch(
    ConfigException $e) {
                    return 
    $e->getMessage();
                }
            }
            
            return 
    $this->_file;
        }
        
        
    /**
         * 
         *     Gibt eine Configdatei zurück
         *     @return String
         */
        
    public function getConfigFile()
        {
            switch(
    $this->_loadConfigFile()) {
                case 
    'xml':
                    
    $this->_config 'xml';
                break;
                case 
    'ini':
                    
    $this->_config 'ini';
                break;
                case 
    'php':
                    
    $this->_config 'php';
                break;
            }
            
            return 
    $this->_config;
        }
        
        
    /**
         * 
         *     Instanzieren der jeweiligen conig Klasse
         *     @return ConfigClass
         */
        
    public function getConfigClass()
        {
            
    $class 'Config' ucfirst($this->getConfigFile());
            require_once 
    LIB_PATH 'Config/' $class '.php';
            
    $this->_configClass = new $class(APPLICATION_PATH 'config/config.' $this->getConfigFile());
            
    $this->_configClass->config();
            return 
    $this->_configClass;
        }
    }
    Der verursachte Fehler ist Folgender.

    Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 261904 bytes) in D:\Softwareentwicklung\Webentwicklung\WendtNeu\classes\Config\Config.php on line 15
    Könnt ihr mir weiter helfen? Vielen Dank für eure Zeit und Hilfe.

    Gruß der Litter
    Zuletzt geändert von litterauspirna; 06.12.2011, 08:33.
    Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
    http://www.lit-web.de

  • #2
    Mit ArrayObject aus der SPL könntest Du das hinbekommen. Allerdings behebt das den aufgetretenen Fehler nicht. Augenscheinlich ist deine Config Datei, die da ausgelesen wird, einfach zu groß für den zur Verfügung gestellten Speicher. Wie sieht denn das Memory Limit bei Dir auf dem Server aus?

    Wieso die Umwandlung in ein Array Objekt?
    MM Newmedia | MeinBlog

    Kommentar


    • #3
      Da ich XAMPP auf meinem localen Rechner nutze habe ich grad mal nachgesehen und bei memory_limit steht 128M drin.
      Ich denke das die Config Klasse nicht zu groß ist.

      Wieso die Umwandlung in ein Array Objekt?
      Weil ich es leserlich sowie von der Implementierung her schöner finde es so zu schreiben

      PHP-Code:
      $config->resources->db->class 
      und nicht so

      PHP-Code:
      $config['resources']['db']['class'
      Wenn ich das SimpleXmlElement Objekt nutze ist das unschöne dabei das Attribute in Knoten als Array dargestellt werden, oder Listen vom gleichen Node auch als Array, aber alles andere als Objekt. Das ist ein Mix der mir so überhaupt nicht gefällt.

      Aus diesem Grund wandel ich mir aus dem SimpleXmlElement Objekt ein Array und will dann diese Umwandlung so haben wie im Problem beschrieben.

      Noch dazu kommt das die Config Datei auch ne ini sein etc. Das sieht man jetzt so nicht auf den ersten Blick raus, aber das ist das Ziel.

      Gruß Litter
      Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
      http://www.lit-web.de

      Kommentar


      • #4
        PHP-Code:
        $a = array(12=> array(456));

        function 
        array2object(array $array) {
            foreach (
        $array as &$value) {
                if (
        is_array($value)) {
                    
        $value array2object($value);
                }
            }
            return new 
        ArrayObject($array);
        }

        $o array2object($a);
        var_dump($o); 
        Code:
        object(ArrayObject)#2 (1) {
          ["storage":"ArrayObject":private]=>
          array(3) {
            [0]=>
            int(1)
            [1]=>
            int(2)
            [3]=>
            object(ArrayObject)#1 (1) {
              ["storage":"ArrayObject":private]=>
              array(3) {
                [0]=>
                int(4)
                [1]=>
                int(5)
                [2]=>
                int(6)
              }
            }
          }
        }
        Deine Funktion getConfigClass() ist übrigens falsch benannt. Sie gibt keine Klasse, sondern ein Objekt zurück.

        Kommentar


        • #5
          XML und PHP Arrays erlauben Bäume.
          INI, CSV usw. ohne Klimmzüge eher nur flache Strukturen.

          Ich würde mir erst mal einen Container für die Struktur basteln. Und diese damit festlegen. Danach die diversen Reader/Writer Klassen um diesen Container zu füllen und sichern zu können.

          So in der Art:
          PHP-Code:

          $ini_file
          ('./config/config.ini');
          $xml_file('./config/config.xml);

          $config = new FlacheStruktur(new XmlFileReaderWriter($xml_file)); 

          // Beispiel für den seltenen Fall, dass auch mal geschrieben werden muss
          $config->setWriter(new IniFileReaderWriter($ini_file)); 
          $config->save(); 
          Wir werden alle sterben

          Kommentar

          Lädt...
          X