Ankündigung

Einklappen
Keine Ankündigung bisher.

mehrdimensionales Array rekursiv auf Klassen-Variabeln mappen

Einklappen

Neue Werbung 2019

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

  • mehrdimensionales Array rekursiv auf Klassen-Variabeln mappen

    Hallo an alle,

    die Funktion "arrayget_object_vars ( object $object )" (http://php.net/manual/en/function.get-class-vars.php) erlaubt es ein mehrdimensionales Array aus Klassen-Variabeln zu ziehen. Weiß jemand zufällig, ob auch eine Möglichkeit gibt diesen Weg andersherum zu gehen? Also, dass man einer Funktion eine Array übergibt und diese Funktion mappt dann die Werte des Array auf die Klassen-Variablen.

    Habe schon versucht mir selbst solche einen Mapper zu bauen, aber dieser arbeitet nicht richtig, sobald es in dem Array wieder eine Stufe nach oben geht:

    PHP-Code:
      /**  * @param $params  * @param $alloc  */ public function allocation($params,$alloc){    foreach($params as $key => $value) {       if(is_array($value)){          $alloc $alloc->$key;          $this->allocation($value,$alloc);       }else{          $alloc->$key $value;       }     } } 
    Gruß User5518

  • #2
    PHP-Code:
    (object) $array 
    aber warum sollte man das machen wollen?

    Kommentar


    • #3
      Zitat von Dormilich Beitrag anzeigen
      PHP-Code:
      (object) $array 
      aber warum sollte man das machen wollen?
      Cast nach Object ergibt immer nur eine Instanz der stdClass.

      Es gibt auch eine richtig "fancy" Variante, eine Googlesuche nach "php array to object" hilft da bestimmt.
      Ansonsten empfehle ich, in der betroffenen Klasse (aufnehmende Klasse) eine Methode bereitzustellen, die das Array einliest - evtl auch im Konstruktor
      Ajax ist auch ein Putzmittel.

      Kommentar


      • #4
        Zitat von zille Beitrag anzeigen
        Cast nach Object ergibt immer nur eine Instanz der stdClass.
        Da man ja nie weiß, welche Properties angelegt werden, kann man diese ja in einer speziellen (nutzerdefinierten) Klasse ja auch nicht benutzen. Da reicht stdClass völlig aus.

        Kommentar


        • #5
          Warum möchtest du das über Arrays machen und nutzt nicht die Möglichkeiten der Serialisierung von Objekten ?

          Kommentar


          • #6
            (object) $array hilft mir leider nicht, da es nur die erste Ebene des Arrays in die Stdclass wandelt, alle verschachtelten Arrays sind nach wie vor arrays.

            Konkret habe ich eine Klasse, in der z.B. folgende Variabeln inital anleget wurden:

            [...]
            $this->kd = new stdClass();
            $this->kd->e = '';
            $this->kd->t = '';
            $this->kd->m = '';
            $this->kd->f = '';
            $this->kd->ki = '';
            $this->kd->nl = '';
            $this->ra = new stdClass();
            $this->ra->a = new stdClass();
            $this->re->a->p = '';
            $this->re->a->o = new stdClass();
            $this->re->a->o->oc = '';
            [...]

            mein Array sieht analog dazu wie folgt aus:

            Code:
            [...]
            
             ["kd"]=>
              array(6) {
                ["e"]=>
                string(0) ""
                ["t"]=>
                string(0) ""
                ["m"]=>
                string(0) ""
                ["f"]=>
                string(0) ""
                ["ki"]=>
                string(0) ""
                ["nl"]=>
                string(0) ""
              }
              ["ra"]=>
              array(2) {
                ["a"]=>
                array(5) {
                  ["p"]=>
                  string(0) ""
                  ["o"]=>
                  array(2) {
                    ["oc"]=>
                    string(0) ""
            
            [...]
            Diese Klasse wird in mehreren bestehenden Projekten verwendet. Wenn ich die Klasse jetzt groß umbaue bekomme ich zeitlich ein Problem, da sich das auch auf andere Klasse im Code auswirkt (zummal es als Submodule auch in anderen Projekten verwendet wird), daher wollte ich das Parameter den Konstruktur (in dem auch die Variabeln definiert sind) ein wenig aufbrohren:

            Code:
            public function __construct($params = null)
            So dass ich dann "einfach", wenn "params" nicht null ist, die Variabelen setzen kann...

            Kommentar


            • #7
              was spricht denn gegen eine normale Objektserialisierung wie von jspit vorgeschlagen? (naja, es ginge noch json_decode() …)

              Kommentar


              • #8
                PHP-Code:
                namespace MyNamespace;

                class 
                ArrayObject {
                    private 
                $arrayContent;
                    
                    public function 
                __construct(array $arrayContent) {
                        
                $this->arrayContent array_map(function ($value) {
                            if (
                is_array($value)) {
                                return new 
                ArrayObject($value);
                            } else {
                                return 
                $value;
                            }
                        }, 
                $arrayContent);
                    }
                    
                    public function 
                __get($propertyName) {
                        return 
                $this->arrayContent[$propertyName];
                    }
                    
                    public function 
                __set($propertyName$value) {
                        
                $this->arrayContent[$propertyName] = $value;
                    }

                PHP-Code:
                $array = array('foo' => array('bar' => 'baz'));

                $object = new \MyNamespace\ArrayObject($array);
                echo 
                $object->foo->bar// baz 

                Kommentar


                • #9
                  Sorry, evtl. stehe ich gerade auf dem Schlauch, aber wie soll eine Objektserialisierung hier helfen?

                  Kommentar


                  • #10
                    du willst eine Objektwiederherstellung durchführen, also mußt du vorher ein ein Objekt in irgend einer Art serialisiert haben. sowas macht man üblicherweise mit serialize(), vielleicht noch mit json_encode(), und nicht mit get_object_vars().

                    Und mit den Serializable & JsonSerialize Interfaces kannst du zudem genau definieren, was von dem Objekt serialisiert werden soll.

                    Kommentar


                    • #11
                      Eine Objektwiederherstellung ist es nicht direkt. Ich habe eine relativ großes Formular (genau das gesagt ein Zend_Form inkl. Subforms) vorliegen, das mir die eingegebenen Daten (praktischerweise?!) als Array wiedergibt. Das Zend Framework kümmert sich also darum, dass aus dem POST-Objekt ein Array wird und ich würde das nun "einfach" gerne in ein Klassenobjekt mit den entsprechenden Werten überführen. Dazu brauche ich die passenden Funktion, die mir die Werte aus dem Array auf passenden Klassen-Variabeln mappt. Praktischerweise heißen die Keys des Arrays genauso wie die Variabeln.

                      Kommentar


                      • #12
                        Kann man den ZF nicht sagen, daß man ein Objekt haben will (ich weiß, daß Symfony das kann, da sollte es für ZF nicht unmöglich sein)?

                        ansonsten: json_decode(json_encode($array))

                        Kommentar


                        • #13
                          Müsste ich mir morgen noch mal ansehen, ob ZF das kann. Sonst erledigt das von dir vorgeschlagene "json_de- und encode" den Job schon ganz gut bis auf die Tatsache, dass das erzeugte Objekt ausschließlich aus StdClass besteht, jedoch brauche ich eine Instanz meiner Klasse (nur die untergeordneten, ursprünglichen müssen eine StdClass sein). In anderen Sprachen könnte man das einfach casten, wenn ich mich nicht irre ist das in PHP nich so einfach möglich oder täusche ich mich gerade?

                          Kommentar


                          • #14
                            Was gefällt dir an meiner Lösung nicht?

                            Kommentar


                            • #15
                              OT: Es ist so ein Phänomen in Foren, das lieber stundenlang diskutiert wird, anstelle vorgeschlagene Lösungen umgehend zu testen. Ist doch in Sekunden erledigt.
                              Ich frage mich, haben die TE nur ihr Blödphon vor der Nase anstelle am Entwicklungssystem zu sitzen?

                              Zum Thema: Sehe auch #8 als eine mögliche Lösung. Wenn aus kosmetischen Gründen intern der Objekttyp stdClass gewünscht wird, dann wird eben die eine Zeile geändert.

                              Kommentar

                              Lädt...
                              X