Array Class Property über variable zusammen bauen

südpol

Erfahrenes Mitglied
Hi,

um eine Funktion möglichst generisch zu bauen wollte ich den Namen eines Property dynamisch an diese Funktion übergeben um diese zu verarbeiten. Bei einfachen strings als Property funktioniert das auch wie gewünscht. Bei arrays allerdings nicht :-(. Hier mal etwas testcode um mein Problem verständlich zu machen.

PHP:
class testobj01 {
	public $ID;
	public $Liste = array();
}

class testobj02 {
	public $ID;
}


$List = array();
$obj = NEW testobj01();
$obj->ID = 1;
$List[$obj->ID] = $obj;
$obj = NEW testobj01();
$obj->ID = 2;
$List[$obj->ID] = $obj;

$ParamName = "Liste";
foreach($List as $key => $rootobj) {
	$child = NEW testobj02();
	$child->ID = 1;
	// TEST1
	$List[$key]->$ParamName[$child->ID] = $child;
	// TEST2
	$newName = $ParamName."[".$child->ID."]";
	$List[$key]->$newName = $child;
}

print_r($List);

Relevant ist die Zeile bei TEST1 und TEST2 - ich würde ungerne eval einsetzen um mein Ziel zu erreichen. Hat jemand noch einen anderen Vorschlag bzw. eine Idee was ich falsch mache?
 
Hey,
ich gebe einfach mal zu, dass das Skript gerade ziemlich Kryptisch anmutet:
Wenn ich in WTF/Min messen müsste, wären das momentan 15/min^^
Ich habs jetzt ganz einfach und ganz blöd gelöst:
Code:
<?php
class testobj01 {
    public $ID;
    public $Liste = array();
}

class testobj02 {
    public $ID;
}


$List = array();
$obj = NEW testobj01();
$obj->ID = 1;
$List[$obj->ID] = $obj;
$obj = NEW testobj01();
$obj->ID = 2;
$List[$obj->ID] = $obj;

$ParamName = "Liste";
foreach($List as $key => $rootobj) {
    $child = NEW testobj02();
    $child->ID = 1;
    // TEST1
    $List[$key]->$ParamName[$child->ID] = $child;
    // TEST2
    $child->ID = 2;
    $newName = $ParamName."[".$child->ID."]";
    $List[$key]->$newName = $child;
}

print_r($List); 
?>
Ich habe es so verstanden, dass Du eine Ausgabe all´a
Code:
Array
(
    [1] => testobj01 Object
        (
            [ID] => 1
            [Liste] => Array
                (
                )

            [i] => testobj02 Object
                (
                    [ID] => 2
                )

            [Liste[2]] => testobj02 Object
                (
                    [ID] => 2
                )

        )

    [2] => testobj01 Object
        (
            [ID] => 2
            [Liste] => Array
                (
                )

            [i] => testobj02 Object
                (
                    [ID] => 2
                )

            [Liste[2]] => testobj02 Object
                (
                    [ID] => 2
                )

        )

)
Haben möchtest. Eventuell verstehe ich das einfach grad auch nicht, aber es könnte ja sein ;)

MfG
 
südpol, erklär doch mal was du damit machen willst. Dann können wir dir auch sagen wie man das lösen kann
PHP:
    $newName = $ParamName."[".$child->ID."]";
    $List[$key]->$newName = $child;
$newName sieht dann so aus:
String: 'Liste[1]'
Das ist selbstverständlich ein ungültiger Property-Name mit den [] drin.
 
Hi,

oh mist 15 WTF pro Min - dann ist der code wirklich übel, zumal er auch nicht lang genug ist, dass ich behaupten könnte, dass du einfach nur schnell lesen kannst ;)

Also ich versuchs etwas ausführlicher. Ich habe ein array ($List) welches Objekte vom Typ testobj01 enthält. Diese Liste durchlaufe ich mit einer foreach Schleife um bei jedem dieser Objekte ein Property array mit weiteren Objekten vom Typ testobj02 hinzuzufügen (wobei der $key des arrays die ID des entsprechenden testobj02 ist). Da ich das in meinem richtigen code für einige Objekte machen muss wollte ich das ganze generisch bauen. Daher der Versuch den Namen des Property als Variable zu setzen:
PHP:
$List[$key]->$ParamName[$child->ID] = $child;
Wenn $key = 1, $ParamName = Liste und $child->ID = 1 wäre, dann sollte der reale code so aussehen:
PHP:
$List[1]->Liste[1] = $child;
Leider kommt genau das raus, was darksider3 gepostet hat.

Mit Properties die kein array sind funktioniert das ohne Probleme:
PHP:
$List[$key]->$ParamName = $child;

Hoffe, dass bringt die WTF's pro min auf eine erträgliche Menge runter.
 
Zurück