Ankündigung

Einklappen
Keine Ankündigung bisher.

Object as Array

Einklappen

Unconfigured Ad Widget

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

  • micbur
    hat ein Thema erstellt Object as Array.

    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

  • Chriz
    antwortet
    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.

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    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..

    Einen Kommentar schreiben:


  • yab
    antwortet
    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?)

    Einen Kommentar schreiben:


  • Chriz
    antwortet
    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.

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    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.

    Einen Kommentar schreiben:


  • duderino
    antwortet
    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;

    Einen Kommentar schreiben:


  • dr.e.
    antwortet
    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.

    Einen Kommentar schreiben:


  • mAy^daY
    antwortet
    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.

    Einen Kommentar schreiben:


  • dr.e.
    antwortet
    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.

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    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;

    Einen Kommentar schreiben:

Lädt...
X