Frage

Ich möchte in der Lage sein, die folgenden Aufgaben:

$normal_array       = array();
$array_of_arrayrefs = array( &$normal_array );

// Here I want to access the $normal_array reference **as a reference**,
// but that doesn't work obviously. How to do it?
end( $array_of_arrayrefs )["one"] = 1; // choking on this one

print $normal_array["one"]; // should output 1

Viele Grüße

/ R

War es hilfreich?

Lösung

end() gibt keinen Bezug des letzten Wertes, sondern der letzte Wert selbst. Hier ist eine Abhilfe:

$normal_array       = array();
$array_of_arrayrefs = array( &$normal_array );

$refArray = &end_byref( $array_of_arrayrefs );
$refArray["one"] = 1;

print $normal_array["one"]; // should output 1

function &end_byref( &$array ) {
    $lastKey = end(array_keys($array));
    end($array);
    return $array[$lastKey];
}

Andere Tipps

Hier sind ein paar Ansätze, von denen keines mir besonders befriedigend. Ich bin sicher, dass es eine bessere Art und Weise ..

<?php
$normal_array       = array();
$array_of_arrayrefs = array( "blah", &$normal_array );

foreach ($array_of_arrayrefs as &$v);
$v["one"] = 1;

echo $normal_array["one"];  //prints 1
?>


<?php
$normal_array       = array();
$array_of_arrayrefs = array( "blah", &$normal_array );

$lastIndex = @end(array_keys($array_of_arrayrefs)); //raises E_STRICT because end() expects referable.
$array_of_arrayrefs[$lastIndex]["one"] = 1;

echo $normal_array["one"];  //prints 1
?>

Sie sollten wahrscheinlich nicht durch Bezugnahme in erster Linie werden vorbei. Es ist in der Regel schlechte Praxis betrachtet, dies zu tun, weil sie es schwer zu sehen, machen wo verändert wird.

Es ist ein sehr verbreiteter Irrtum, dass Referenzen schneller sind. Dies ist nicht der Fall ist - in der Tat, sie sind ein wenig langsamer, aber es ist von einer so geringen Menge, dass es wirklich keine Rolle spielt. PHP hat ein System namens copy-on-write, was bedeutet, dass Variablen nicht tatsächlich kopiert, bevor Sie sie schreiben.

Der einzige Ort, wo man wirklich Referenzen benötigen, waren in PHP4, wo Objekte sonst geklont erhalten würde. Dies ist nicht erforderlich in PHP5.

Die Funktion end () nicht nur einen Wert zurückgeben. Es bewegt sich auch der interne Zeiger des Arrays. Dann können wir Taste () verwenden, um den Index zu erhalten, nach dem wir regelmäßigem Array-Zugriff für die Zuordnung zu verwenden, sind in der Lage.

$normal_array       = array();
$array_of_arrayrefs = array( &$normal_array );

end($array_of_arrayrefs);
$array_of_arrayrefs[ key($array_of_arrayrefs) ]["one"] = 1;

print $normal_array["one"];

Die Zeile:

  

Ende ($ array_of_arrayrefs) [ "one"] = 1; // auf diesen ein Würgen

wirft einen Parser-Fehler:

  

Parse-Fehler: Syntaxfehler, unerwartete '[' in /file.php on line 65

Vergewissern Sie sich, error_reporting und display_error aktiviert.

Ich bin nicht sicher, was Sie tun wollen, aber dies funktioniert:

$normal_array       = array();
$array_of_arrayrefs = array( &$normal_array );
// Here I want to access the $normal_array reference **as a reference**,
// but that doesn't work obviously. How to do it?
$array_of_arrayrefs[0]["one"] = 1;
//end($array_of_arrayrefs )["one"] = 1; // choking on this one
print $normal_array["one"]; // should output 1
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top