Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

array[] überschreibt alle Werte

0 views
Skip to first unread message

Jan Novak

unread,
Feb 10, 2023, 2:38:14 AM2/10/23
to
Hallo,

ich habe ein sehr seltsames Problem mit eine Grundfunktion von PHP:

public function getFilesFor($dir=CFG["tempdir"], $files=array(),
$jsonOutput=true){

$File2 = new File2();
$myRet=array();
foreach ($files as $file) {
$f=$File2->createO5File($dir."/".$file);
//dd ist eine debug Ausgabe mit <pre>print_r(var) </pre>
dd($f); // hier kommt das korrekte File2 Objekt an
//array_push ($myRet, $f); // das funktioniert nicht
$myRet[]=$f; // das auch nicht
dd($myRet); //hier wird zwar ein neues Objekt in das array
addiert, allerdings werden alle Elemente im Array mit dem letzten
hinzugefügten File2 Objekt überschrieben
}
//das myret enthält die Anzahl der Datensätze aus der forech Schleife
aber alle sind die gleichen und zwar das jeweils zuletzt angefügte Element
return $myRet;
}

Nochmal in kurz:
Ich bekomme aus einer Funktion ein Objekt, welches ich in ein array
addieren will. Am Ende enthält das Array die korrekte Anzahl der
Objekte, aber alle haben die gleichen Werte wie das zuletzt hinzugefügte
Objekt.


Jan

Jan Novak

unread,
Feb 10, 2023, 3:01:09 AM2/10/23
to
Am 10.02.23 um 08:38 schrieb Jan Novak:
Kurze Ergänzung: wenn ich das File2 Objekt vor dem addieren in das myRet
Array "dismounte" (also ein Array aus dem Objekt mache), dann klappt es
und das myRet Array enthält korrekte Werte. Gewünscht war allerdings,
dass in myRet File2 Objekte enthalten sind.

Jan

Jan Novak

unread,
Feb 10, 2023, 3:03:24 AM2/10/23
to
Am 10.02.23 um 09:01 schrieb Jan Novak:
> Am 10.02.23 um 08:38 schrieb Jan Novak:
>> Hallo,
>>
>> ich habe ein sehr seltsames Problem mit eine Grundfunktion von PHP:
>>
>> public function getFilesFor($dir=CFG["tempdir"], $files=array(),
>> $jsonOutput=true){
>>
>>      $File2 = new File2();
>>      $myRet=array();
>>      foreach ($files as $file) {
>>        $f=$File2->createO5File($dir."/".$file);
>> //dd ist eine debug Ausgabe mit <pre>print_r(var) </pre>
>>        dd($f); // hier kommt das korrekte File2 Objekt an
>>        //array_push ($myRet, $f); // das funktioniert nicht
>>        $myRet[]=$f;               // das auch nicht
>>        dd($myRet); //hier wird zwar ein neues Objekt in das array
>> addiert, allerdings werden alle Elemente im Array mit dem letzten
>> hinzugefügten File2 Objekt überschrieben
>>      }
>> //das myret enthält die Anzahl der Datensätze aus der forech Schleife
>> aber alle sind die gleichen und zwar das jeweils zuletzt angefügte
>> Element
>>      return $myRet;
>>    }

OMG ... die Zeile

$File2 = new File2();

gehört natürlich in die Schleife und nicht ausserhalb derer.


Jan

Karl Pflästerer

unread,
Feb 10, 2023, 3:10:10 AM2/10/23
to
Deine Funktion gib immer das *identische* Objekt zurück. Wenn du aus dem
Objekt ein array machst, werden die aktuellen property Werte kopiert.

Bringe die Funktion dazu, nicht jedesmal das identsicghe Objekt (mit
anderen Werten zurückzugeben), oder clone selbst


KP

Arno Welzel

unread,
Feb 18, 2023, 7:32:37 PM2/18/23
to
Jan Novak, 2023-02-10 08:38:
1) Lerne XDebug zu benutzen, statt mühselig debug-Ausgabe zu erzeugen.

2) PHP kennt nur Referenzen.

Je nach dem, was createO5File() genau tut, kann es sein, dass das
Ergebnis immer die selbe Referenz ist, weil $File2 ja auch immer das
gleiche Objekt bleibt und nicht jedesmal neu erzeugt wird. Deshalb hast
Du dann am Ende eben mehrfach immer wieder die selbe Referenz statt
unterschiedlicher Objekte.

--
Arno Welzel
https://arnowelzel.de

0 new messages