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

时间:2008-10-10 15:30:36

标签: php arrays reference pass-by-reference

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

$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

5 个答案:

答案 0 :(得分:4)

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 :(得分: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
?>

答案 2 :(得分:1)

您可能不应该首先通过引用传递。这通常被认为是不好的做法,因为它很难看出状态被修改的地方。

这是一种非常常见的误解,即引用速度更快。事实并非如此 - 事实上,它们有点慢,但它的数量很少,它确实无关紧要。 PHP有一个名为copy-on-write的系统,这意味着在写入变量之前,实际上并没有复制变量。

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

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

该行:

  

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