Ankündigung

Einklappen
Keine Ankündigung bisher.

Object as Array

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

  • Object as Array

    Hallo,

    ich habe schon gesucht, aber nichts gefunden, was ich machen könnte.

    Ich habe ein Object. Ich würde gerne durch die ganzen Felder in dem Object durchgehen. Wie komme ich da hin?

    Ich würde einfach das Object gerne als Array haben wollen, dann kann ich mir einer foreach-Schleife durchgehen. Aber auch da weiß ich nicht wie es geht.

    Was kann ich nun machen und vor allem wie?

    Ciao, micbur


  • #2
    Wenn Sie ein Objekt in ein Array umwandeln, bekommen Sie die Eigenschaften (Mitgliedsvariablen) des Objekts als Elemente des Arrays. Die Schlüssel sind die Namen der Mitgliedsvariablen.
    $array = (array) $object;
    --

    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


    --

    Kommentar


    • #3
      Hallo micbur,

      im objektorientierten Ansatz implementiert man hier to*()-Funktionen. Üblicherweise gibt es in JAVA toString() oder toChar(). Ich würde an deiner Stelle hier eine toArray()-Methode implementieren, die dir die Klassen-Variablen als Array zurück gibt. Das kann ungefähr so aussehen:

      PHP-Code:

      ...
      function 
      to array(){
        return 
      get_class_vars($this);
      }
      ?> 
      Wenn du nur bestimmte Variablen zurückgeben möchtest musst du noch ein bischen Code hinzufügen.
      Viele Grüße,
      Dr.E.

      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      1. Think about software design before you start to write code!
      2. Discuss and review it together with experts!
      3. Choose good tools (-> Adventure PHP Framework (APF))!
      4. Write clean and reusable software only!
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

      Kommentar


      • #4
        Re: Object as Array

        Zitat von micbur
        Ich habe ein Object. Ich würde gerne durch die ganzen Felder in dem Object durchgehen. Wie komme ich da hin?
        PHP-Code:

        while (list($key$value) = each($object)) {
          echo 
        $key.' => '.$value.'
        '
        ;

        Also so kannst du ein Objekt durchgehen und jeden Wert ausgeben.

        Kommentar


        • #5
          Hallo mAy^day,

          das ist (in PHP 5) nicht ganz korrekt und der objektorientierte Ansatz sieht das auch nicht so vor. Bei deinem Code bekommst du IMHO in PHP 5 einen Fehler bei privaten und geschützten Membern.
          Viele Grüße,
          Dr.E.

          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          1. Think about software design before you start to write code!
          2. Discuss and review it together with experts!
          3. Choose good tools (-> Adventure PHP Framework (APF))!
          4. Write clean and reusable software only!
          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

          Kommentar


          • #6
            PHP-Code:
            function object2array($obj) {
                
            $_arr is_object($obj) ? get_object_vars($obj) : $obj;
                foreach (
            $_arr as $key => $val) {
                    
            $val = (is_array($val) || is_object($val)) ? object2array($val) : $val;
                    
            $arr[$key] = $val;
                }
                return 
            $arr;

            Kommentar


            • #7
              Rauskram. Habe herade gesehen, wieviele Hits dieser Thread hat, deswegen wollte ich noch ergänzen, dass in PHP5 je nach Anwendungszweck die Implementierung der Interfaces [MAN]ArrayIterator[/MAN] bzw. [MAN]ArrayAccess[/MAN] zielführend sind, um native Arrayzugriffe/schleifen zu ermoeglichen.
              --

              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
              Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


              --

              Kommentar


              • #8
                Wobei ich es zweifelhaft finde, über ein z.B. User-Objekt zu iterieren oder ArrayAccess darauf zu verwenden. Ein Objekt ist ja im Gegensatz zum Array gerade keine Liste gleichartiger Elemente, sondern hat völlig unterschiedliche Eigenschaften, die von mir aus zwar in einem Zug ausgegeben werden können, aber dann doch nicht immer. Möchte ich bei einem User-Objekt das Passwort ausgeben, sicherlich nicht immer, was ist mit der ID des Datensatzes? Dann fange ich entweder an, im Objekt selbst zu filtern (der Iterator überspringt intern also Eigenschaften), dann habe ich ein Problem, wenn ich dann doch mal über diese Eigenschaften mititerieren möchte, oder aber ich filtere das ganze mit einer Blacklist:
                PHP-Code:
                <?php
                while (current($userObject)) {
                  
                $property key($userObject);
                  
                $value current($userObject);
                  if (
                $property == "id" || $property == "password") {
                    continue;
                  }
                  echo 
                "$property$value<br />";
                }
                ?>
                Und dann wirds tükisch, sobald das User-Objekt erweitert wird (neue Datenbankfelder, neue 1:1 Beziehung) das für die Ausgabe aber so noch garnicht geplant wurde. Das heißt letztlich sind wir dann doch wieder dabei, von einer Blacklist auf eine Whitelist umzustellen und somit wieder bei 0, man hätte sich den Iterator also auch sparen können.

                ArrayAccess auf ein Objekt finde ich nicht gut, wegen dem [] Array-Operator, der hier nicht funktioniert und der Tatsache, dass ein Objekt nunmal ein Objekt ist, das getter/setter-Methoden hat, und kein Array.
                "Mein Name ist Lohse, ich kaufe hier ein."

                Kommentar


                • #9
                  Zitat von Chriz Beitrag anzeigen
                  Möchte ich bei einem User-Objekt das Passwort ausgeben, sicherlich nicht immer, was ist mit der ID des Datensatzes?
                  Naja, das könnte man ja im Template regeln, dass nur definierte Template-Variablen auch ausgegeben werden.

                  Zitat von Chriz Beitrag anzeigen
                  ArrayAccess auf ein Objekt finde ich nicht gut, wegen dem [] Array-Operator, der hier nicht funktioniert und der Tatsache, dass ein Objekt nunmal ein Objekt ist, das getter/setter-Methoden hat, und kein Array.
                  Wenn ein Objekt das Interface ArrayAccess implementiert, dann verhält es sich nun mal wie ein Array, inkl. dem [] Array-Operator (warum sollte der nicht funktionieren?)

                  Kommentar


                  • #10
                    Wohl, weil es vermutlich keine Property mit numerischen Namen geben kann. Wenn man sich da was ausknobelt wirkt das vermutlich schon wie eine Krücke..
                    --

                    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                    --

                    Kommentar


                    • #11
                      Warum, numerisch geht doch dachte ich. Ich meinte falls eine Property ein Array ist, kann ich nichts auf den Inhalt pushen:
                      PHP-Code:
                      <?php
                      class Xy implements ArrayAccess {
                        protected 
                      $_properties = array("myArray" => array());
                        public function 
                      offsetSet($property$value) {
                          
                      $this->_properties[$property] = $value;
                        }
                        public function 
                      offsetGet($property) {
                          return 
                      $this->_properties[$property];
                        }
                        
                      // ..
                      }
                      $xy = new Xy();
                      $xy["myArray"][] = "neues MyArray-Element"// failure
                      // ..
                      $array $xy["myArray"];
                      $array[] = "neues MyArray-Element";
                      $xy["myArray"] = $array// success
                      ?>
                      Sicherlich, ist wahrscheinlich nicht einfach zu implementieren, trotzdem schlecht fürs ganze Konzept.
                      "Mein Name ist Lohse, ich kaufe hier ein."

                      Kommentar

                      Lädt...
                      X