2017-12-05 6 views
1

Ich habe versucht, die folgenden in Anwendung chunk zu verwenden:Laravel eloquent chunk nicht funktioniert

$out = []; 
\App\User::chunk(5,function($users) use($out){ 
    foreach($users as $user){ 
     //$out[] = $user; 
     $out[] = $user->id; 
    } 
}); 
dd($out); 

jedoch die Ausgabe von dd($out) ist noch leer Array. Was ist das Problem hier? $out ist im globalen Umfang!

+2

sein kein Problem mit Brocken, es ist eine PHP-Sache ... Arrays sind Copy on Write, wenn nichts anderes gesagt – lagbox

+0

@ raina77ow es gibt Array einzelnen Element wie erwartet. d. h. 'Array: 1 [▼ 0 => 1 ]' – SaidbakR

+2

Beantwortet unten, https://3v4l.org/IQsMO –

Antwort

1

Siehe, use in PHP nicht nur eine Variable von äußeren Umfang innerhalb der Funktion verfügbar (ähnlich lexikalischen Umfang in JS etc.). Es Kopien der Wert dieser Variablen (und here's more explanation, aus irgendeinem Grund noch im offiziellen Dokument fehlt).

Nehmen Sie use als ein Mittel, um einen Wert innerhalb der Funktion zu übergeben, ohne es zu einem formalen Parameter, ein Teil der Signatur der Funktion.

Unterm Strich ist, sollten Sie das Array als Referenz übergeben:

\App\User::chunk(5,function($users) use(&$out){ 
    foreach($users as $user){ 
     //$out[] = $user; 
     $out[] = $user->id; 
    } 
}); 
+0

Gute Erklärung, die das Konzept des Bereichskonzepts behebt! Vielen Dank. – SaidbakR

2

Arrays Copy on Write sind. Sie erstellen gerade ein neues Array in diesem Bereich, wenn Sie versuchen, in das Array zu schreiben, das Sie aus dem übergeordneten Bereich importieren möchten.

Sie müssen den Verweis auf das Array verwenden.

function ($users) use (&$out) { ... } 
+0

Es funktioniert, aber es bricht mein Verständnis über Umfang. Array ist eine Variable und wird in einem globalen oder übergeordneten Bereich definiert. Daher sollte sie logisch mit den neuen Daten im untergeordneten Bereich aktualisiert werden !!! – SaidbakR

+1

@ SaidbakR nicht Vars mit Klassen verwechseln, Objekte immer als Referenz übergeben. https://3v4l.org/VXfm5 –

+0

"Ab PHP 5 enthält eine Objektvariable das Objekt selbst nicht mehr als Wert. Es enthält nur einen Objektidentifikator, der Objektaccessoren erlaubt, das tatsächliche Objekt zu finden. Wenn ein Objekt ist Die Variablen sind keine Aliasnamen. Sie enthalten eine Kopie des Bezeichners, der auf das gleiche Objekt zeigt. " – raina77ow

Verwandte Themen