Как я могу использовать ссылки на массивы внутри массивов в PHP? - PullRequest
3 голосов
/ 10 октября 2008

Я хочу иметь возможность сделать следующее:

$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

Привет

/ Р

Ответы [ 5 ]

4 голосов
/ 10 октября 2008

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];
}
1 голос
/ 11 октября 2008

Вы, вероятно, не должны проходить по ссылке в первую очередь. Это обычно считается плохой практикой, потому что трудно увидеть, где изменяется состояние.

Это очень распространенное заблуждение, что ссылки быстрее. Это не так - на самом деле, они немного медленнее, но это настолько мало, что это действительно не имеет значения. В PHP есть система, называемая copy-on-write, что означает, что переменные на самом деле не копируются перед тем, как вы в них пишете.

Единственное место, где вам действительно нужны ссылки, было в PHP4, где объекты были бы клонированы в противном случае. Это не нужно в PHP5.

1 голос
/ 10 октября 2008

Вот пара подходов, ни один из которых я не нахожу особенно удовлетворительным. Я уверен, что есть лучший способ ..

<?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
?>
0 голосов
/ 10 января 2009

Функция 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"];
0 голосов
/ 10 октября 2008

Линия:

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
...