Andreas-Lindig: Objekte in einer foreach()-Schleife, kann man die referenzieren?

Hallo Forum,

Ich hab mal ne Frage zu folgendem Problem:

eine Sammlung von Objekten -> $Objekte[0] = $objekt1,
                              $Objekte[1] = $objekt2 usw...

//durchrattern in einer foreach-Schleife
//und für jedes Objekt Eigenschaften mit einer Methode ändern

foreach($objekte as $ein_objekt)
   $ein_objekt->eigenschaft_aendern()

//Objekte ausgeben

foreach($objekte as $ein_objekt)
   $ein_objekt->ausgeben()

nun haben sich die Eigenschaften in den Original-Objekten aber nicht geändert. Wenn ich das Ganze aber mit einer for-Schleife mache und statt $ein_objekt immer $objekte[$i] aufrufe funktioniert es. Ich schließe daraus, daß $ein_objekt in der for-Schleife eine Kopie des jeweiligen Elements ist und keine Referenz.

Ist das richtig? Und wie kann ich in einer foreach-Schleife eine Referenz bekommen, um umständliche for-Schleifen mit Zähler zu vermeiden?

Gruß, Andreas

--
<img src="http://was-ist-das.andreas-lindig.de/was_ist_das_fetzen.jpg" border="0" alt="">
hier könnte auch ruhig mal'n neues Bild stehen.
  1. Hi,

    Ich schließe daraus, daß $ein_objekt in der for-Schleife eine Kopie des jeweiligen Elements ist und keine Referenz.

    Ist das richtig? Und wie kann ich in einer foreach-Schleife eine Referenz bekommen, um umständliche for-Schleifen mit Zähler zu vermeiden?

    ja - das ist richtig, foreach() arbeitet mit Kopien. Du brauchst allerdings keine Referenzen, um dein Problem zu lösen:

    <?php

    foreach (array_keys($objekte) as $key) {

    $objekte[$key]->eigenschaft_aendern();

    /*
         * oder, wenn du unbedingt Referenzen haben möchtest... ;-)
         *
         * $val =& $objekte[$key];
         * $val->eigenschaft_aendern();
         */

    }

    ?>

    Gruß,
    Andreas.

    1. Hallo Andreas,

      Danke, funktioniert supi! - muß man ja einfach nur drauf kommen, gell? ;-)

      Gruß, Andreas

      --
      <img src="http://was-ist-das.andreas-lindig.de/was_ist_das_fetzen.jpg" border="0" alt="">
      hier könnte auch ruhig mal'n neues Bild stehen.