Как из функции вернуть ссылку на элемент глобального массива?

gadyuka

Новичок
Есть следующий упрощенный для примера код:

PHP:
$Arr=array(
   "bar" => array("a" => 0, "b" => 1),
   "foo" => array("a" => 0, "b" => 1)
);

function GetElement($AName) {
   global $Arr;
   $xElement=&$Arr[$AName];
   return $xElement;
}

function SetValue($AValue) {
   global $Arr;
   $xElement=GetElement("bar");
   $xElement["c"]=$AValue;
}
Необходимо чтобы значения, устанавливаемые функцией SetValue записывались в сам глобальный массив $Arr[elenemt_name][param_name]. В вышеприведенном коде это не работает, значение $AValue ставится только в локальную копию - не смотря на то, что возвращается вроде бы референс на элемент, а не сам элемент.

Пробовала и такой вариант:


PHP:
function GetElement($AName, &$AElement) {
   global $Arr;
   $AElement=&$Arr[$AName];
}

function SetValue($AValue) {
   global $Arr;
   GetElement("bar", $xElement);
   $xElement["c"]=$AValue;
}
В этом коде функция SetValue вообще не получает ссылки на $Arr["bar"]. А если в GetElement присваивать не &$Arr[$AName], а $AElement=$Arr[$AName] - то ситуация идентична первому варианту.

Как сделать, чтобы оно работало как надо?
 

С.

Продвинутый новичок
Не надо так извращаться со ссылками. Во-первых, & делает не то, что ты думаешь. А во-вторых, РНР вообще не создан для такого рода операций.
 

gadyuka

Новичок
Все, сама нашла решение, тему можно закрывать.

Решение (вдруг кому пригодится)

PHP:
function &GetElement($AName) {
   global $Arr;
   $xElement=&$Arr[$AName];
   return $xElement;
}

function SetValue($AValue) {
   global $Arr;
   $xElement=&GetElement("bar");
   $xElement["c"]=$AValue;
}
Протупила с возвратом ссылок функцией со знаком & перед именем функции
 

Фанат

oncle terrible
Команда форума
Не надо так извращаться со ссылками. Во-первых, & делает не то, что ты думаешь. А во-вторых, РНР вообще не создан для такого рода операций.
Да лано тебе.
Человек явно делает выдачу элемента массива по цепочке индексов.
Скажи спасибо, что не евалом.
 

Тугай

Новичок
global уже написан и остальное просто изврат, код эквивалентен:

PHP:
$Arr=array(
   "bar" => array("a" => 0, "b" => 1),
   "foo" => array("a" => 0, "b" => 1)
);

function GetElement($AName) {
   global $Arr;
   return $Arr[$AName];
}

function SetValue($AValue) {
   global $Arr;
   $Arr['bar']['c']=$AValue;
}
В PHP нет адресной арифметики, вместо нее таблица символов. и оператор & - не возвращает адрес в памяти, а создает еще запсиь в таблице симвлолов или алиас - что не ускоряет работу, а наоборот.
В вашем примере вы непонятно зачем нагрузили дополнительно таблицу смиволов два раза.
В глобальной таблице символов есть запись для $Arr.
В каждой функции, когда напсано global, эта запись дублирруется в локальную таблицу для функции. Когда вы внутри функции пишит что угодно с & - вы раздуваете локальнцю таблицу символов, при том что запись для $Arr уже есть.
 
Сверху