Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Problem beim dynamischen Erweitern von Arrays in Object Porperties

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Problem beim dynamischen Erweitern von Arrays in Object Porperties

    edit:
    In Objekten str_repeat(", die Arrays von Objekten enthalten", n) ein Objekt finden und dessen Properties zu aktualisieren funktioniert nicht, wenn ein Array erweitert werden soll.
    ende edit (Ist etwas länglich geworden, deshalb hab' das eigentliche Problem mal vornan gestellt)

    Moin,

    Ich habe mir gedacht, um tiefer einzusteigen, wäre es am besten, mal ein eigenes Datenbank-Framework anzufangen (zum Lernen! Klappt auch ganz gut - bisher)

    Jetzt bin ich bei der Master-Detail-Problematik und habe ein Problem bei der Zuweisung der von der DB zurückgelieferten Werte.
    Mein Entwurf geht von existierenden je DB-Tabelle spezialisierten-Objekten (im Code mit Präfix db_) aus, die hier verschachtelt werden:

    PHP-Code:
    class meinDBJoinObject
    {
        public function 
    __construct()
        {
            
    $this->maintable = new db_master('mast');
            
    $this->children['deta'] = array( 'joinWith' => array('mastID' => 'mastID')
                                           , 
    'joinType' => 'L'
                                           
    'srcObj' => array(new db_detaila('deta')));
            
    $this->children['deta']['srcObj'][0]
                 ->
    children['zdet'] = array( 'joinWith' => array('detaID' => 'detaID')
                                           , 
    'joinType' => 'L'
                                           
    'srcObj' => array(new db_zuodets('zdet')));
            
    $this->children['deta']['srcObj'][0]
                 ->
    children['zdet']['srcObj'][0]
                 ->
    children['detb'] = array( 'joinWith' => array('detbID' => 'detbID')
                                           , 
    'joinType' => 'L'
                                           
    'srcObj' => array(new db_detailb('detb')));
        }

    Die joinWith- und joinType-Einträge brauche ich fürs SQL generieren.

    Ich schicke das Statement an die DB fetch das Result in ein Array, iterier das durch, bekomme anhand von Alias-Präfixen heraus, welche Result Column zu welchem Teil des Objekts gehört.

    Da stehe ich nun mit einer Hand voll Werte, die zu bspw. 'detb' gehören.
    Um die in das Objekt zu speichern, suche ich zunächst nach eben jenem Schlüssel 'detb' in einem Array, schreibe die Werte in die entsprechenden Properties und mache einen tiefen Clone von dem Eintrag, den ich anschliessend "wertbereinige" (Datenproperties auf null setzen).

    Bis hierher klappt es, aber ich habe noch keinen Weg gefunden, diesen Clone dynamisch an das Array im Objekt anzuhängen.
    Ausprogrammiert müsste es ja so aussehen (Ja, die Nullen sind nur proforma da, am Iterieren (findet noch gar nicht statt) liegts nicht):
    PHP-Code:
            $this->children['deta']['srcObj'][0]
                 ->
    children['zdet']['srcObj'][0]
                 ->
    children['detb']['srcObj'][] = $meinDetailB_Clone
    Mich wundert eben, dass ich beim Setzen der Werte in die Properties saubere Referenzen bekomme, also $this am Ende aktualisiert ist.
    Wenn ich denselben Weg für das pushen des Arrays wähle, nimmt $this das nicht an:
    PHP-Code:
        public function find_srcObj_array($findkey$start_element null)
        
    //Die Funktion findet den Schlüssel und gibt das gefundene Array zurück
        
    {
            if (
    $start_element === null)
            {
                
    $start_element $this;
            }
            if ((
    is_object($start_element)) || (is_array($start_element)))
            {
                foreach(
    $start_element as $key => $value)
                {
                    if (
    $key === $findkey)
                    {
                        return 
    $value['srcObj'];
                    }
                    if ((
    is_array($value)) || (is_object($value)))
                    {
                        
    $newvalue $this->find_srcObj_array($findkey$value);
                        if (
    $newvalue)
                        {
                            return 
    $newvalue;
                        }
                    }
                }
            }
            return 
    false;
        }

    // so teste ich gerade:
    // suchen - klappt
    $tmp $this->find_srcObj_array('detb');
    //zuweisen - klappt und wird im Objekt ($this) auch geändert
    $tmp[0]->detbID $db_result_rec['detb']['detbID']; // eg. 20
    // clone - klappt ("eigene" Methode - Referenzen werden in Werte umgewandelt)
    $tmp_x = clone $tmp[0];
    // Zuweisung - klappt
    $tmp_x->detbID 200;

    // ans Array pushen - klappt nur im direkten Kontext.
    // Das Objekt $this bekommt davon nix mit
    $tmp[] = $tmp_x 
    Ich hab auch schon verschiedenste Varianten von &, also byRef ausprobiert - ohne Erfolg (bzw. hat es in zwei Konstellationen den Apache vom Sockel gehauen)

    Geht das nicht? Oder nur mit Pfad zum Array in nem String zusammensetzen und eval?

    Ich hoffe Ihr könnt mir helfen.
    Danke im Voraus!!

  • #2
    Hallo,

    ich versteh überhaupt nicht was du machen willst und was davon nicht geht. Wozu möchtest du Objekte klonen, wenn du Werte aus der Datenbank ausliest?

    Kannst du das Problem herunterbrechen?

    PS: Deine Variablenbenennung ist ne Katastrophe
    "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

    Kommentar


    • #3
      Das Klonen ist nicht das Problem und verursacht auch keins.

      Also:
      Ein Objekt A soll Master und Details und deren Details , die alle aus der DB selektiert wurden enthalten.

      Dazu gebe ich Objekt A eine Property, die ein Objekt M ist, das spezialisiert auf die Tabelle mit den Masterdaten ist.

      Objekt M wird dann ergänzt um eine weitere Property: ein Array.

      In dieses Array wird ein Objekt D gepackt, das per se spezialisiert ist auf die Tabelle mit Detail-Datensätzen zum Master.

      Objekt D wird dann auch um eine weitere Property, ein Array, ergänzt

      In dieses Array wird ein Objekt D2 gepackt, das per se spezialisiert ist auf die Tabelle mit Detail-Datensätzen zu Detail-Datensätzen zu Master.

      Sprich: Es existiert jetzt eine dreistufige Hierarchie.

      Was mir gelingt, ist das Auffinden des Zielobjekts, um die Werte in die entsprechenden Properties (von Objekt M, D oder D2) zu schreiben und das Schreiben selbst.

      Wenn ich jetzt aber beim nächsten Datensatz bin, ist bspw. Master gleich dem bereits gespeicherten Master, Detail gleich dem gespeicherten Detail, aber Detail-Detail (für Objekt D2) ist neu.

      Sprich: Auf Stufe 3 der Hierarchie soll dem Array ein weiteres Element hinzugefügt werden. Am Ende quasi:
      PHP-Code:
      -Objekt M
         
      -detail[0]
            - 
      Objekt D (Instanz)
               -
      detail2[0]
                  - 
      Objekt D2 (Instanz)
               -
      detail2[1]
                  - 
      Objekt D2  (Instanz)
         -
      detail[1]
            - 
      Objekt D (Instanz)
               -
      detail2[0]
                  - 
      Objekt D2 (Instanz)
               -
      detail2[1]
                  - 
      Objekt D2  (Instanz)

      -
      detail[0]-detail2[0]
      und   
      -detail[1]-detail2[0]
      haben (ausser der Datenquellenichts miteinander zu tun 
      Ich bekomme in das Array, das als Property an -detail[0] hängt und bereits -detail2[0] enthält, kein weiteres Element -detail2[1] angefügt.
      Es sei denn (s. o.) ich würde es ausprogrammieren.

      So klarer?

      EDIT: Bin jetzt 2/3 Tage offline, falls also jemand ne Antwort für mich hat, nicht wundern, wenn ich vor So./Mo.nicht antworte

      Kommentar


      • #4
        Lösung

        Also:
        Ein Objekt enthält Arrays, die Arrays enthalten, die Objekte enthalten, die Arrays enthalten, die Array enthalten, die Objekte enthalten.

        Zweck: Hierarchien von Datenobjekten , wie sie bspw. von einer DB-Abfrage auf Master-Detail(-Detail-Detail...)-Strukturen zurückgeliefert werden, abzubilden und die Daten zur Laufzeit innerhalb dieser Hierarchie vorhalten.

        Die Arrays, in denen die eigentlichen Objekte liegen, sind im umgebenden Array über den Schlüssel "srcObj" (=Quellobjekt=eigentliches Objelt) zu finden.

        Diese umgebenden Arrays (, die jeweils Properties des jeweils übergeordneten Objektes (Master) sind, enthalten einen Alias des Objekttyps, der im jeweiligen "srcObj" gespeichert werden soll.

        Aufgabe: Einen Datensatz, der vom Typ "abcd" ist, welcher auf einer beliebigen, aber nicht der obersten, Ebene der Hierarchie liegt in das entsprechende "srcObj"-Array pushen.

        Lösung:
        PHP-Code:
            public function push_srcObj_array($findkey$valueToPush, &$startElement)
            {
                if ((
        is_object($startElement)) || (is_array($startElement)))
                {
                    foreach(
        $startElement as $key => $value)
                    {
                        if (
        $key === $findkey)
                        {
                            if (
        is_array($value))
                            {
                                foreach(
        $value as $akey => $avalue)
                                {
                                    if (
        $akey == 'srcObj')
                                    {
                                        
        $startElement[$key][$akey][] = $valueToPush;
                                    }
                                }
                            }
                            return;
                        }
                        elseif ((
        is_array($value)) || (is_object($value)))
                        {
        /*
        Die folgende Fallunterscheidung war es, die mir anfänglich fehlte
        */
                            // examine in what kind of start_element we are
                            // because different syntaces are needed
                            
        if ($startElement->$key)
                            {
                                
        // we are in an object. so build ref with ->
                                
        $cascadeValue =& $startElement->$key;
                            }
                            else
                            {
                                
        // we are in an array. so build ref with []
                                
        $cascadeValue =& $startElement[$key];
                            }
                            
        $this->push_srcObj_array($findkey$valueToPush$cascadeValue);
                        }
                    }
                }
            }

        //Aufruf mit:
        push_srcObj_array('abcd'$ObjektVomTypABCD$this); 

        Kommentar

        Lädt...
        X