Я хочу уметь делать следующее:
$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
С уважением
/Р






Линия:
end( $array_of_arrayrefs )["one"] = 1; // choking on this one
выдает ошибку синтаксического анализа:
Parse error: syntax error, unexpected '[' in /file.php on line 65
Убедитесь, что у вас активированы error_reporting и display_error.
Я не уверен, что вы хотите сделать, но это работает:
$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
end() возвращает не ссылку на последнее значение, а само последнее значение. Вот обходной путь:
$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];
}
Вот пара подходов, ни один из которых я не считаю особенно удовлетворительным. Я уверен, что есть способ получше ...
<?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
?>
Вероятно, вам вообще не следует передавать по ссылке. Обычно это считается плохой практикой, потому что из-за этого трудно увидеть, где изменяется состояние.
Это очень распространенное заблуждение, что ссылки быстрее. Это не так - на самом деле они немного медленнее, но на такую небольшую величину, что это действительно не имеет значения. В PHP есть система, называемая копированием при записи, что означает, что переменные фактически не копируются до того, как вы напишете в них.
Единственное место, где вам действительно нужны ссылки, было в PHP4, где в противном случае объекты были бы клонированы. В PHP5 этого не требуется.
Функция end () не просто возвращает значение. Он также перемещает внутренний указатель массива. Затем мы можем использовать key () для получения индекса, после чего мы можем использовать обычный доступ к массиву для присвоения.
$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"];