Wie kann ich Array-Referenzen innerhalb Arrays in PHP?
-
08-07-2019 - |
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
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