Discussion:
array[] überschreibt alle Werte
(zu alt für eine Antwort)
Jan Novak
2023-02-10 07:38:12 UTC
Permalink
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
2023-02-10 08:01:07 UTC
Permalink
Post by Jan Novak
Hallo,
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;
  }
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.
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
2023-02-10 08:03:22 UTC
Permalink
Post by Jan Novak
Hallo,
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
2023-02-10 08:10:09 UTC
Permalink
Post by Jan Novak
Hallo,
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;
  }
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.
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
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
2023-02-19 00:32:36 UTC
Permalink
Post by Jan Novak
Hallo,
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;
}
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.
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
Loading...