2016-05-23 5 views
1

Könnte mir jemand erklären, warum dieser Code richtig funktioniert, ohne ursprüngliche Array-Struktur abstürzen?PHP paradoxes (komisches) Verhalten. Senden Array zu Funktion durch Referenz

function setArrayValueByPath($path, $value, &$array) 
{ 
    foreach ($path as $p) { 
     $array = &$array[$p]; 
    } 
    $array = $value; 
    return true; 
} 

$array = [ 
    'a' => 'v1', 
    'b' => 'v2', 
]; 
setArrayValueByPath(['hello', 'world'], '!!!', $array); 

echo '<pre>'; 
print_r($array); 
echo '</pre>'; 

Wenn ich den Code ausführen, ich sehe:

Array 
(
    [a] => v1 
    [b] => v2 
    [hello] => Array 
     (
      [world] => !!! 
     ) 

) 

Aufgrund der Linie in der Funktion:

$array = $value; 

es $ array Wert ersetzen soll, aber es geschieht nicht.

Meine Funktion basiert auf Code-Schnipsel sind hier gegeben: Using a string path to set nested array data Vielen Dank.

Antwort

1

Lassen Sie uns einen Schritt nach dem anderen untersuchen.

Der Parameter $array ist ein lokaler Variable innerhalb der Funktion, die einen Verweis auf einige externen Array enthält in übergeben wird.

foreach ($path as $p) { 

Diese iteriert über ['hello', 'world']

$array = &$array[$p]; 

das ursprüngliche Array Nehmen und "index" es mit $p (dh [Hallo]). Dies ist derzeit nicht vorhanden und wird daher zum ursprünglichen Array hinzugefügt. Nehmen Sie dann einen Verweis auf dieses neue Element, und speichern Sie es in der lokalen Variablen $array. I.e. Sie haben gerade ein neues Mitglied des ursprünglichen Arrays erstellt, und die lokale Variable $arrayzeigt nicht mehr auf das ursprüngliche externe Array.

Auf der zweiten Iteration die Variable nehmen zeigte gerade durch $array (nur oben) und indizieren mit $p (world). Das gibt es nicht, also erstelle es.

} 

An diesem Punkt $array Punkte auf dem Element {original array}[hello][world]. Ich benutze die Syntax {original array} hier, weil Sie nicht mehr einen Verweis darauf haben, nur einen Verweis auf ein Array zwei Ebenen darin verschachtelt.

$array = $value; 

Dies setzt den Wert dieses Elements zu !!!, genau die Datenstruktur geben Sie sehen.

+0

Trotz auf SO bittet, "Danke" in den Kommentaren zu vermeiden, danke ich Ihnen noch hier, mein Herr. Nun .. Sieht klar aus, aber ich bin richtig, es ist viel besser, anders benannte Variablen zu verwenden, um den Code verständlicher zu machen? –

Verwandte Themen