php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 30.07.2005, 22:13   #1 (permalink)
Gast
 
Beiträge: n/a
Standard Referenzen auf Objekte innerhalb eines Arrays

Guten Abend,

ich habe hier ein kleines Problem mit Referenzen auf Objekte innerhalb eines Arrays.
Mein Script ist recht umfangreich, deswegen habe ich es mal auf ein Beispiel reduziert:
Code:
#Testklasse
class test {
   var $property;

   function test($param) {
      $this->property=$param;
   }

}

#Objekte erzeugen
$objects=array();
$objects[]=new test(1);
$objects[]=new test(2);
$objects[]=new test(3);

#Objekte ausgeben
echo "<pre>";
print_r($objects);
echo"</pre>";

#Referenzen auf Objekte erzeugen
$references=array();
foreach($objects as $object) {
   $references[]=&$object;
}

#Referenzen ausgeben
echo "<hr /><pre>";
print_r($references);
echo"</pre>";
Die Ausgabe hiervon ist nun
Code:
Array
(
    [0] => test Object
        (
            [property] => 1
        )
    [1] => test Object
        (
            [property] => 2
        )
    [2] => test Object
        (
            [property] => 3
        )
)
Array
(
    [0] => test Object
        (
            [property] => 3
        )
    [1] => test Object
        (
            [property] => 3
        )
    [2] => test Object
        (
            [property] => 3
        )
)
Die Referenzen zeigen also alle auf das letzte Element. Was mache ich denn da falsch? Wie müsste ich die Referenzen zuweisen sodass auch wirklich die richtigen Objekte referenziert werden?

Vielen Dank im Voraus für jeden Tip!

dms
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 30.07.2005, 23:01   #2 (permalink)
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.818
axo
Standard

das ist auch klar ... mit deiner foreach - schleife überschreibst du permanent die referenz.
das verhalten von php ist also richtig, auch wenn es strange erscheint.

korrekt würde dein skript so arbeiten:
PHP-Code:
<?php
#Referenzen auf Objekte erzeugen
$references=array();
for (
$i=0,$m=count($objects);$i<$m;$i++) {
  
$references[] = &$objects[$i];    
}
?>
grüße
axo
axo ist offline   Mit Zitat antworten
Alt 31.07.2005, 00:47   #3 (permalink)
Gast
 
Beiträge: n/a
Standard

Dank Dir vielmals, axo. Das leuchtet mir sogar ein.
  Mit Zitat antworten
Alt 31.08.2009, 08:38   #4 (permalink)
Neuer Benutzer
 
Registriert seit: 31.08.2009
Beiträge: 1
PHP-Kenntnisse:
Fortgeschritten
djxflash befindet sich auf einem aufstrebenden Ast
Standard

PHP-Code:
<?php
$tubel
=new ListView;
if(
$tubel->sortieren("+meine Tunte)==-1) echo("selber ein tubel");
$ok=true;
 
 
class ListView {
    var $table;
    var $idArr=array();
    var $ioformArr=array();
    var $indexInt;
    var $write;
    var $deleteOn;
 
    function __construct($ioformArr, $idArr=NULL, $deleteOn=NULL) {
    Error::logFunction(8,"
construct");
        if(!is_array($ioformArr)) $ioformArr=array($ioformArr);
        if(!is_array($idArr)) $idArr=array($idArr);
        $this->ioformArr=$ioformArr;
        $this->idArr=$idArr;
        $this->indexInt=0;
 
        foreach($ioformArr as $ioform) {
            if($ioform->getStatus()) $write=true;
        }
        $this->write=$write;
 
        if($this->write) {
            echo("
<form method='post' action='' enctype='multipart/form-data'>");
            if(!$_POST['sub'.$this->table]) {
                //foreach($ioformArr as $ioform) $ioform->setNoWrite(true);
            }
            if($_POST['del'.$this->table]) {
                foreach($ioformArr as $ioform) $ioform->setDelete(true);
            }
        }
 
        if($idArr[0]) sortieren($idArr);
    }
 
    function sortieren($idArr) {
    Error::logFunction(8,"
sort");
        $this->idArr=$idArr;
        $ioformArr2=array();
        $idArr2=array();
        for($z=0; $z<count($this->ioformArr); $z++) {
            $idArr2[$z]=$this->ioformArr[$z]->getItem(0);
        }
        for($x=0; $x<count($idArr); $x++) {
            for($z=0; $z<count($idArr2) OR $idArr2[$z]==$idArr[$z]; $z++) $ioformArr2[$x]=$this->ioformArr[$z];
        }
        $this->ioformArr=$ioformArr2;
    }
 
    function showNext() {
    Error::logFunction(8,"
showNext");
        if(is_object($this->ioformArr[$this->indexInt])) $this->ioformArr[$this->indexInt]->show();
        $this->indexInt++;
    }
 
    function __destruct() {
    Error::logFunction(8,"
destruct");
        if($this->write) {
            echo("
<input type='submit' name'sub".$this->table."' value='Speichern' />");
            if($this->deleteOn) {
                echo("
<input type='button' name'del".$this->table."' value='Abbrechen' /></form>");
            }
            echo("
</form>");
        }
    }
 
}
 
 
class ListStandard extends ListView {
    var $style;
    var $spalten;
    var $count;
    /*
    function __construct($table, $idArr, $elementDArr, $spalten, $style=NULL, $dBase=NULL, $write=NULL) {
        parent::__construct($table, $idArr, $elementDArr, $style, $write);
        $this->spalten=$spalten;
        $this->style=$style;
        $this->count=count($elementDArr[0]);
    }*/
 
    function __construct($elementYArr, $idArr=NULL, $deleteOn=NULL) {
    Error::logFunction(8,"
ListStandard::construct");
        $this->style=$style;
        $countXs=count($elementYArr);
        $this->spalten=$countXs;
        for($z=0; $z<$countXs; $z++) if($countYs<count($elementYArr[$z])) $countYs=count($elementYArr[$z]);
        $countD=count($elementYArr[0]);
        $zD=0;
 
        for($y=0; $y<$countYs; $y++) {
            for($x=0; $x<$countXs; $x++) {
                $elementDArr[$zD]=$elementYArr[$x][$y];
                $zD++;
            }
        }
 
        parent::__construct($elementDArr, $idArr, $deleteOn);
        $this->count=count($elementDArr);
    }
 
    function show() {
    Error::logFunction(8,"
ListStandard::show");
        echo("
<table cellspacing='1' cellpadding='1' border='0'>");
        for($x=0; $x<$this->count/$this->spalten; $x++) {
            echo("
<tr>");
            for($z=0; $z<$this->spalten; $z++) {
                echo("
<td style='HEIGHT: 23px'>");
                parent::showNext();
                echo("
</td>");
            }
            echo("
</tr>");
        }
        echo("
</table>");
    }
}
 
?>
Edit Chriz: BBCode, bitte nächstes mal selbst einfügen

Geändert von Chriz (31.08.2009 um 12:19 Uhr).
djxflash ist offline   Mit Zitat antworten
Alt 31.08.2009, 12:02   #5 (permalink)
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.020
PHP-Kenntnisse:
Fortgeschritten
dr.e. sorgt für eine eindrucksvolle Atmosphäredr.e. sorgt für eine eindrucksvolle Atmosphäredr.e. sorgt für eine eindrucksvolle Atmosphäre
dr.e. eine Nachricht über Skype™ schicken
Standard

Was sollen uns diese Zeilen sagen?
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist gerade online   Mit Zitat antworten
Alt 31.08.2009, 14:37   #6 (permalink)
Erfahrener Benutzer
 
Registriert seit: 30.07.2008
Beiträge: 273
PHP-Kenntnisse:
Fortgeschritten
xm22 befindet sich auf einem aufstrebenden Ast
Standard

@TE: OBjekte werden ab PHP5 standardmäßig als Referenz übergeben und das sollte man auch benutzen, statt PHP4

Geändert von xm22 (31.08.2009 um 14:40 Uhr).
xm22 ist offline   Mit Zitat antworten
Alt 31.08.2009, 17:06   #7 (permalink)
Erfahrener Benutzer
 
Registriert seit: 17.07.2009
Beiträge: 118
PHP-Kenntnisse:
Anfänger
Tiberius befindet sich auf einem aufstrebenden Ast
Standard

es genügt das & eine Zeile nach oben zu schieben

PHP-Code:
foreach($objects as &$object) {
   
$references[]=$object;

dies ist einer der Gründe weshalb ich kein Fan von foreach bin aber das ist ein anderes Thema, in deinem Fall wird es dir helfen
Tiberius ist offline   Mit Zitat antworten
Antwort


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
Mehrere Arrays summieren buggybugga PHP-Fortgeschrittene 8 22.07.2008 11:51
[Erledigt] Objekte übergeben Felix PHP Tipps 2008 23 18.06.2008 12:21
Arrays sortieren, Bezeichnung, Preis Ticos PHP Tipps 2006 4 07.09.2006 19:37
Arrays kreuzen PHP Tipps 2006 13 08.03.2006 11:36
[Erledigt] Objekte in Arrays suchen PHP-Fortgeschrittene 5 20.01.2006 20:58
[Erledigt] 2 Arrays miteinander vergleichen PHP Tipps 2007 3 17.12.2005 16:54
Objektorientierter Zugriff auf Multidimensionale Arrays PHP-Fortgeschrittene 31 26.11.2005 21:46
Problem beim vergleichen von 2 Arrays PHP Tipps 2005-2 1 06.10.2005 14:25
Problem mit Referenzen auf Arrays PHP-Fortgeschrittene 4 16.09.2005 23:13
[Erledigt] Zahl innerhalb eines Arrays ausgeben PHP Tipps 2005 22 29.04.2005 13:53
Erkennung von Arrays in Strings PHP-Fortgeschrittene 15 07.12.2004 13:00
Referenzen (lies Pointer) innerhalb mehrdimensionaler Arrays PHP-Fortgeschrittene 2 17.09.2004 14:00
Referenzen auf Objekte PHP-Fortgeschrittene 2 17.08.2004 11:08
2 arrays in abhängigkeit ??? PHP Tipps 2004 2 11.08.2004 21:19
Werte eines Arrays in eine MySQL schreiben PHP Tipps 2004 2 28.06.2004 13:32

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php array mit objekten, php array aus objekten, php referenz array, php array referenzen, php objekt array, php objekte in array, php object referenz array, php referenz auf array, php object to array, array objekt php zugreifen, php value objekte array, php array objekt suchen, php referenzen array, php array mit objekten in post speichern, php objekt in array, array objekte anlegen php, php reference array, php array referenz, php objekt in array zugreifen, objekte in array php

Alle Zeitangaben in WEZ +1. Es ist jetzt 16:29 Uhr.




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

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.