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

DiMA

php.spb.ru
Команда форума
Как через аргумент-ссылку функции вернуть ссылку?

Функция test получает на входе ссылку на массив. Функция рекурсивно чего-то делает и в итоге должна вернуть (через аргументы её самой) ссылки внутрь массива. Не важно чего она там делает... Пусть, надо вернуть ссылку или ссылки на случайные элементы массива. Вопрос - как вернуть через аргумент N2 (3,4,5..) ссылку на элемент массива, переданным как ссылку через аргумент N1? Нужно вернуть именно ссылку, а не копию куска массива. Т.к. после вызова функции по ссылкам должен меняться оригинальный массив.

Код:
function test1(&$array, &$point) {
    $point=$array['item'];
}

$array=array(
'z'=>'zzz',
'item'=>
    array(
    'name'=>'111',
    'title'=>'222',
    ),
);

test1($array, $p);

print_r($p);          // (1)
$p['name']='HELLO';
print_r($p);          // (2)
print_r($array);       // (3)
выдает
Код:
Array
(
    [name] => 111
    [title] => 222
)
Array
(
    [name] => HELLO
    [title] => 222
)
Array
(
    [z] => zzz
    [item] => Array
        (
            [name] => 111       (*)
            [title] => 222
        )

)
(*) говорит о том, что $p['name']='HELLO'; оперирует копией куска массива $array. Т.е. из функции вернули не ссылку на массив, а копию. Но нужна ссылка. Если в (3) на месте (*) было бы написано HELLO, это была бы действительно копия.

Если делать так:
Код:
function test2(&$array) {
    return array(&$array['item']);
}

$array=array(
'z'=>'zzz',
'item'=>
    array(
    'name'=>'111',
    'title'=>'222',
    ),
);

$ret=test2($array);

print_r($ret[0]);        // (4)
$ret[0]['name']='WORLD';
print_r($ret[0]);        // (5)
print_r($array);          // (6)
то результат будет таким, каким нужно, вернут действительно ссылку:

Код:
Array
(
    [name] => 111
    [title] => 222
)
Array
(
    [name] => WORLD
    [title] => 222
)
Array
(
    [z] => zzz
    [item] => Array
        (
            [name] => WORLD
            [title] => 222
        )

)
При возврате кучи нужных ссылок (в примере - один параметр) через массив все работает, но как бы тоже самое сделать через аргументы функции? Это надо, т.к. функция сама по себе рекурсивная и после нее разбирать массив не хочется (тем более, что list(,,,,)=$return ссылки вообще не обрабатывает).
 

yaniks

новичок
а что мешает использовать способ два, а потом сделать ссылку полученного значения на аргумент (сам не понял что сказал :) ), ну что-то типа :
PHP:
function &test(&$array,$var1) {
    $var2 = &$array['item'];
    return $var2;
}

$array=array(
'z'=>'zzz',
'item'=>
    array(
    'name'=>'111',
    'title'=>'222',
    ),
);



$p2 = &test($array, $p1); $p1 = &$p2;
 

bgm

 
Может быть я что-то не понял, но вот пример возврата жёстких ссылок через аргумент функции:
PHP:
function reb (&$mass, &$link) {
	$link[] = &$mass[0]['demon'];
	$link[] = &$mass[0]['dem'];
}

$arr[]=Array("demon"=>'secta', "dem"=>Array("inn1"=>"yo","inn2"=>"mum"));
print_r($arr);

$linker = Array();

reb ($arr,$linker);

$linker[0]=Array(0=>$linker[0],1=>235);
$linker[1][]=666;

print_r($arr);
 
Сверху