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

Я хочу уметь делать следующее:

$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

С уважением

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
0
2 068
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Линия:

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"];

Другие вопросы по теме