我可以为 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
)
)
您还需要通过引用将数组传递给函数
我有一个嵌套数组,我有一个对该数组中元素的引用。我希望能够使用我的引用在该数组中分配一个值,但我不知道该怎么做。
$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
)
)
您还需要通过引用将数组传递给函数