Как я могу использовать ссылки на массивы внутри массивов в PHP?

#php #arrays #reference #pass-by-reference

Вопрос:

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

 $normal_array       = array();
$array_of_arrayrefs = array( amp;$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
 

С уважением

/R

Ответ №1:

end() возвращает не ссылку на последнее значение, а скорее само последнее значение. Вот обходной путь:

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

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

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

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

Ответ №2:

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

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

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

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


<?php
$normal_array       = array();
$array_of_arrayrefs = array( "blah", amp;$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
?>
 

Ответ №3:

Вероятно, вам вообще не следует передавать информацию по ссылке. Обычно это считается плохой практикой, потому что из-за этого трудно понять, где изменяется состояние.

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

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

Ответ №4:

Функция end() не просто возвращает значение. Он также перемещает внутренний указатель массива. Затем мы можем использовать key() для получения индекса, после чего мы сможем использовать обычный доступ к массиву для назначения.

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

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

print $normal_array["one"];
 

Ответ №5:

Линия:

end( $array_of_arrayrefs )[«один»] = 1; // задыхаюсь от этого

выдает ошибку синтаксического анализа:

Ошибка синтаксического анализа: синтаксическая ошибка, неожиданная «[» в /file.php на линии 65

Убедитесь, что у вас есть error_reporting и display_error активирован.

Я не уверен, что ты хочешь сделать, но это работает:

 $normal_array       = array();
$array_of_arrayrefs = array( amp;$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