如何在PHP中的数组内使用数组引用?
问题描述:
我希望能够做到以下几点:如何在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];
}
答
行:
end($array_of_arrayrefs)["one"] = 1; // choking on this one
抛出一个解析错误:
Parse error: syntax error, unexpected '[' in /file.php on line 65
确保您已激活error_reporting
和display_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
答
这里有几种方法,我都觉得这两种方法都不令人满意。 我敢肯定有一个更好的办法..
<?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有一个名为copy-on-write的系统,这意味着变量在写入之前不会被实际复制。
你真的需要引用的唯一地方是在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"];