我可以为 PHP 中的参考目标赋值吗? (我想取消引用)

Can I assign value to target of reference in PHP? (I want to dereference)

我有一个嵌套数组,我有一个对该数组中元素的引用。我希望能够使用我的引用在该数组中分配一个值,但我不知道该怎么做。

$arr = ['foo' => ['bar' => 'Hello World']];
$ref =& $arr['foo']['bar'];

var_export($arr);
//  array (
//    'foo' => 
//    array (
//      'bar' => 'Hello World',
//    ),
//  )

var_export($ref);
//  'Hello World'

$arr['foo']['bar'] = 'Test';
var_export($ref);
//  'Test'

以上工作正常,但我现在想使用我的参考分配一个新值给'bar':

&$ref = 'fooz';
PHP Parse error:  syntax error, unexpected '&', expecting end of file in php shell code on line 1

我试过了,但是不行:

$ref =& 'fooz';
PHP Parse error:  syntax error, unexpected ';', expecting :: (T_PAAMAYIM_NEKUDOTAYIM) in php shell code on line 1

有点令人担忧的是,尝试此分配似乎会损坏数据:

$ref &= 'fooz';
var_export($ref);
//  '@elh'

var_export($arr);
//  array (
//    'foo' => 
//    array (
//      'bar' => '@elh',
//    ),
//  )

背景:我有一个可以嵌套也可以不嵌套的数组,因此很难找到我想要分配东西的叶节点。所以我希望得到一个引用到那个叶节点,然后一切都会很可爱。

我在 Linux Mint 20.2(64 位)上有 PHP 运行。

$ php --version
PHP 7.4.3 (cli) (built: Jul  5 2021 15:13:35) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies

补充20210907-1518: 我正在使用以下函数来设置我的参考:

function &getNestedArrayRef($array, array $keys) {                                                                    
  $key = array_shift($keys);                                                                                        
  if (!is_null($key)) {                                                                                             
    return getNestedArrayRef($array[$key], $keys);                                                                
  }                                                                                                                 
  return $array;                                                                                                    
}

$ref = &getNestedArrayRef($arr, ['foo', 'bar]);

// The above _should_ be equivalent to:
$ref =& $arr['foo']['bar'];

^ 完全有可能 这没有按预期工作!

但是,如果没有它,在没有文字引用的情况下获取对数组中任意点的引用有点棘手。

认为你让生活变得太复杂了。

使用=&使$ref成为一个参考,所以你不需要再在上面使用&参考思想

$arr = ['foo' => ['bar' => 'Hello World']];
$ref =& $arr['foo']['bar'];

$ref = 'Hi Boyo';
var_dump($arr);

结果

array(1) {
  'foo' => array(1) {
    'bar' => string(7) "Hi Boyo"
  }
}

第二次尝试,当涉及真正的代码时

$arr = ['foo' => ['bar' => 'Hello World']];

function &getNestedArrayRef(&$array, array $keys) {                                                                    
    $key = array_shift($keys);                                                                                        
    if (!is_null($key)) {  
        return getNestedArrayRef($array[$key], $keys);                                                                
    }
    return $array;                                                                                                   
}
  
$ref =& getNestedArrayRef($arr, ['foo', 'bar']);

$ref = 'Bye';
print_r($arr);

结果

Array
(
    [foo] => Array
        (
            [bar] => Bye
        )

)

您还需要通过引用将数组传递给函数