如何在PHP中使用数组内部的数组引用


How can I use array-references inside arrays in PHP?

我希望能够做到以下几点:

$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

问候

/R

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];
}

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

<?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
?>

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

这是一个非常常见的误解,认为引用更快。事实并非如此——事实上,它们有点慢,但速度很小,这真的无关紧要。PHP有一个名为"写时复制"的系统,这意味着在写入变量之前,变量实际上不会被复制。

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

函数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"];

行:

end($array_of_arrayrefs)["one"]=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