php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2010

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 21.05.2010, 04:03  
Benutzer
 
Registriert seit: 28.02.2009
Beiträge: 58
dille001 befindet sich auf einem aufstrebenden Ast
Standard [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!!

Geändert von dille001 (21.05.2010 um 10:19 Uhr).
dille001 ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 21.05.2010, 14:02  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.269
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

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
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline  
Alt 21.05.2010, 14:33  
Benutzer
 
Registriert seit: 28.02.2009
Beiträge: 58
dille001 befindet sich auf einem aufstrebenden Ast
Standard

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

Geändert von dille001 (21.05.2010 um 16:13 Uhr).
dille001 ist offline  
Alt 24.05.2010, 11:52  
Benutzer
 
Registriert seit: 28.02.2009
Beiträge: 58
dille001 befindet sich auf einem aufstrebenden Ast
Standard 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); 
dille001 ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Problem mit Object und in_array() freq.9 PHP Tipps 2007 4 04.12.2005 02:39
Problem beim Zusammenfügen von Arrays mit array_merge PHP Tipps 2005-2 2 08.10.2005 16:44
Problem beim vergleichen von 2 Arrays PHP Tipps 2005-2 1 06.10.2005 14:25
[Erledigt] Problem mit Referenzen auf Arrays PHP-Fortgeschrittene 4 16.09.2005 23:13
Problem mit dynamischen Füllen einer Listbox PHP Tipps 2005-2 1 14.08.2005 11:47
problem mit session / object PHP-Fortgeschrittene 7 04.08.2005 02:33
[TEMPLATEENGINE] Problem mit dem Parsen von Arrays imported_Ben PHP-Fortgeschrittene 5 30.07.2005 11:07
Problem mit arrays..füllen PHP Tipps 2005-2 4 22.07.2005 14:02
update auf php 5.0.4 robo47 Server, Hosting und Workstations 6 10.04.2005 19:00
Verständnis Problem bei Übergabe von Arrays imported_dex PHP Tipps 2005 2 05.03.2005 18:03
problem mit ner Session, es gehn Arrays verloren PHP-Fortgeschrittene 3 10.11.2004 18:01
[Erledigt] Problem mit Arrays PHP-Fortgeschrittene 3 05.11.2004 10:17
Problem beim Auslesen eines Arrays aus Sql db PHP Tipps 2004 23 24.09.2004 09:39
Problem mit dynamischen Menü PHP Tipps 2004 0 02.07.2004 13:40
problem mit dynamischen namen beim formularwerteübergabe Datenbanken 2 18.06.2004 08:30

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php objekt erweitern, php array erweitern, javascript object erweitern, javascript array dynamisch erweitern, php array dynamisch erweitern, javascript array erweitern, php session array erweitern, http://www.php.de/php-einsteiger/68128-erledigt-problem-beim-dynamischen-erweitern-von-arrays-object-porperties.html, php object erweitern, php array dynamisch füllen, php objekte dynamisch erweitern, php array vergrößern, array php erweitern, php array um array erweitern, php array to object, js object erweitern, javascript objekt dynamisch erweitern, javascript object array erweitern, js array dynamisch erweitern, array erweitern

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:02 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum