在引用数组中的最后一个引用上设置元素

Set element on last reference in an array of references

提问人:sharkin 提问时间:10/10/2008 最后编辑:mickmackusasharkin 更新时间:11/23/2023 访问量:2306

问:

我希望能够执行以下操作:

$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 数组 逐个引用

评论


答:

-1赞 Joe Scylla 10/10/2008 #1

该行:

end( $array_of_arrayrefs [“一”] = 1;窒息

抛出解析错误:

解析错误:语法错误,第 65 行 /file.php 中出现意外的“[”

确保您已激活并激活。error_reportingdisplay_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
4赞 Andrew Moore 10/10/2008 #2

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];
}
1赞 rewbs 10/10/2008 #3

这里有几种方法,我觉得都不是特别令人满意。 我相信有更好的方法..

<?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
?>
1赞 troelskn 10/11/2008 #4

您可能一开始就不应该通过引用传递。这样做通常被认为是不好的做法,因为它很难看到状态在哪里被修改。

这是一个非常普遍的误解,认为引用速度更快。事实并非如此 - 事实上,它们有点慢,但数量如此之少,这真的无关紧要。PHP 有一个叫做 copy-on-write 的系统,这意味着在你写入变量之前,变量实际上不会被复制。

唯一真正需要引用的地方是在 PHP4 中,否则对象会被克隆。这在 PHP5 中是不需要的。

0赞 Preston 1/10/2009 #5

函数 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"];
0赞 mickmackusa 11/23/2023 #6

老实说,您的演示要么没有反映用例的实际情况,要么这是一个 XY 问题。

不管前导码是什么,从 PHP7.3 开始,你都可以在不移动指针的情况下访问数组的最后一个键。

代码:(演示)

$normal_array       = [];
$array_of_arrayrefs = [&$normal_array];
$array_of_arrayrefs[array_key_last($array_of_arrayrefs)]["one"] = 1;

echo $normal_array["one"]; // outputs: 1