Я хочу иметь возможность сделать следующее:
$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()
не возвращает ссылку последнего значения, а самое последнее значение. Вот обходной путь:
$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 имеет систему под названием copy-on-write, что означает, что переменные на самом деле не копируются, прежде чем вы напишите им.
Единственное место, где вам действительно нужны ссылки, было в 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"];
Линия:
end ($ array_of_arrayrefs) ["one"] = 1; // задыхаясь от этого
выдает ошибку синтаксического анализа:
Ошибка анализа: синтаксическая ошибка, неожиданная '[' в /file.php в строке 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