Array aus Objekt an anderes Objekt OHNE Referenz übergeben

Anna Bolika

Erfahrenes Mitglied
So, mal sehen, ob mir auch mal jemand helfen kann :-))

Ich habe ein voll bescheuertes Problem. Ich möchte ein Array aus einem Objekt an ein anderes Objekt übergeben. Dies geschieht scheinbar immer als Referenz.

PHP:
$oObj1->aArray1 = $oObj2->aArray2;

Nun will ich mit $oObj2->aArray2 weiterarbeiten OHNE, dass sich das auf Obj1 auswirkt.

Folgendes funktioniert nicht:
PHP:
$oObj1->aArray1 = clone $oObj2->aArray2;

PHP sagt mir, ->aArray2 seit kein Objekt. Klar, es ist ja ein Array. Kein Objekt, kein clone.

Auf php.net steht zum Löschen von Referenzen das hier:

PHP:
$a = 1;
$b =& $a;
unset($a);

Aber auch mit so einer Konstruktion wird mir - übertragen auf mein Beispiel - mit ->aArray2 auch ->aArray1 gelöscht und nicht - wie beschrieben - nur die Referenz.

Es muss doch irgendeine Möglichkeit geben, ein Array von einem Objekt zu einem anderen zu kopieren, OHNE dass so eine blöde Referenz dazwischenhängt.

Versteht mich jemand? Hat jemand Ideen?
 
Hi

Warum nicht einfach ein neues Array anlegen und per Schleife Werte kopieren?
Wenns sowas wie clone für Arrays geben würde
müsste PHP intern genau das machen...
 
Eigentlich dürfte keine Referenz erstellt werden. Ansonsten versuche es mal so:
PHP:
$oObj1->aArray1 = (array) $oObj2->aArray2;
 
Im Notfall:
PHP:
$tempObj = clone $oObj2;
$oObj1->aArray1 = clone $tempObj->aArray2;

Aber ist aAray ein public member oder geht das über Getter und Setter? Wenn Getter und Setter, zeige diese mal.
 
@Yaslaw: clone auf einen Array funktioniert nicht, da ein Array kein Objekt ist.

@TE:
Im Normalfall wird beim Zuweisen eines Arrays in eine andere Variable keine Referenz hinterlegt, sonder der gesamte Array kopiert.

Beispiel:
PHP:
function echoArr( array $arr )
{
    echo '<pre>' . print_r( $arr, true ) . '</pre>';
}

$arrOne = array( 'a' => 'aaa', 'b' => 'bbb', 'c' => 'ccc' );

$arrTwo = $arrOne;

echo '<p>Array 1:</p>';
echoArr( $arrOne );

echo '<p>Array 2:</p>';
echoArr( $arrTwo );

$arrOne['a'] = 'abc'; // Änderung in $arrOne !

echo '<p>Array 1:</p>';
echoArr( $arrOne );

echo '<p>Array 2:</p>';
echoArr( $arrTwo );

Ausgabe:
Code:
Array 1:
Array
(
    [a] => aaa
    [b] => bbb
    [ c] => ccc
)

Array 2:
Array
(
    [a] => aaa
    [b] => bbb
    [ c] => ccc
)

Array 1:
Array
(
    [a] => abc
    [b] => bbb
    [ c] => ccc
)

Array 2:
Array
(
    [a] => aaa
    [b] => bbb
    [ c] => ccc
)

Wenn der Array jetzt aber Objekte als Member hat, dann werden nur die Referenzen der Objekte kopiert (ein Objekt in einer Variable gespeichert ist immer nur die Referenz!).

Gruß
 
Vielen Dank für eure Antworten. Ich habe inzwischen im Ärger alles umgestrickt :-) Trotzdem schau ich mir nochmal einige eurer Lösungen an.

Die Sache mit der Schleife wäre sicher ne Lösung. Fand ich allerdings nicht "schön" :-) Außerdem ist mein Array mehrstufig. Also brächte ich auch noch ne rekursive Kopierroutine.

Die Lösung von "einfach nur crack" klingt gut. Bin ich nicht drauf gekommen. Hab ich aber noch nicht getestet.

Yaslaw hat auch ne Lösung. Nur ist das übergeordnete Objekt sehr groß und enthält zu allem Überfluss noch ne PDO-Instanz, die man - so musste ich auch diese Woche wegen eines anderen Problems feststellen - nicht klonen kann. Die Lösung ist mir auch gekommen, fand ich aber ebenfalls nicht "schön".

Und Raisch. Deine Ausführungen sind mir schon klar. Das Problem tritt bei einem normalen Array nicht auf. Das Problem ist, dass die Arrays teil eines Objektes sind.

Also nochmal vielen Dank für eure Antworten. Ich wollte eigentlich hauptsächlich wissen, ob es einen "normalen, einfachen" Weg gibt, diese blöde Referenzierung zu unterdrücken, der mir nicht einfällt. :-)
 
Ein Array in einem Objekt ist ein Array, ist ein Array, ist ein Array.

Beispiel:
PHP:
class A
{
    public $arrA = null;
}

class B
{
    public $arrB = null;
}

function echoArr( array $arr )
{
    echo '<pre>' . print_r( $arr, true ) . '</pre>';
}

$objA = new A();
$objB = new B();

$objA->arrA = array( 'a' => 'aaa', 'b' => 'bbb', 'c' => 'ccc' );

$objB->arrB = $objA->arrA;

echo '<p>Array 1:</p>';
echoArr( $objA->arrA );

echo '<p>Array 2:</p>';
echoArr( $objB->arrB );

$objA->arrA['a'] = 'abc'; // Änderung vom Array in $objA

echo '<p>Array 1:</p>';
echoArr( $objA->arrA );

echo '<p>Array 2:</p>';
echoArr( $objB->arrB );

Ausgabe:
Code:
Array 1:
Array
(
    [a] => aaa
    [b] => bbb
    [ c] => ccc
)

Array 2:
Array
(
    [a] => aaa
    [b] => bbb
    [ c] => ccc
)

Array 1:
Array
(
    [a] => abc
    [b] => bbb
    [ c] => ccc
)

Array 2:
Array
(
    [a] => aaa
    [b] => bbb
    [ c] => ccc
)

Gruß
 
Zurück