注意:似乎我对发生的事情错了,使用$a = array();
没有问题。这是因为对数组的所有赋值都是通过复制。 (我以为有一些引用的访问导致了问题 - 但这只是一个错字。我在下面的答案中添加了一些细节。
我有一些看起来像这样的PHP:
$myArray = array();
function useArray() {
global $myArray;
// ... do something with myArray ...
}
function clearArray() {
global $myArray;
// ... Somehow clear the global array ...
}
我知道这从设计角度来看很糟糕,但是我需要解决一些我无法改变的第三方代码...
我的问题是我可以在clearArray
函数中添加什么才能使其正常工作?
使用我想我可以循环使用数组并依次取消设置 - 就像这样:$myArray=array();
或unset($myArray);
的通常建议不起作用,因为它们只更改本地版本,而不是全局版本。
function clearArray() {
global $myArray;
foreach($key in array_keys($myArray) ) {
unset( $myArray[$key] );
}
}
但这似乎很丑陋而且不清楚。有更好的解决方案吗?
答案 0 :(得分:8)
不要忘记有两种方法可以访问全局变量:
function clearArray() {
unset($GLOBALS['myArray']);
}
答案 1 :(得分:1)
使用$myArray=array();
或 的通常建议显然有用。unset($myArray);
答案 2 :(得分:0)
您可以通过引用传递:
$a = array ('one', 'two', 'three');
print_r ($a);
fone ($a);
print_r ($a);
ftwo ($a);
print_r ($a);
function fone ($a)
{
$a = array ();
}
function ftwo (&$a)
{
$a = array ();
}
结果:
Array
(
[0] => one
[1] => two
[2] => three
)
Array
(
[0] => one
[1] => two
[2] => three
)
Array
(
)
答案 3 :(得分:0)
PHP的数组赋值是通过复制(而对象分配是通过引用)。这意味着您认为存在的许多漏洞根本就不存在。
这是一个简单的例子:
$a = array("A");
$b = &$a;
$c = $a;
function clear1() {
global $a;
$a = array();
}
clear1();
print(json_encode(array($a,$b,$c))."\n");
这会输出[[],[],["A"]]
。使用您帖子中的clear获得相同的结果。
function clear2(){
global $a;
foreach(array_keys($a) as $key) {
unset( $a[$key] );
}
}
$c
期间未清除$b
的原因是$c
是$a
的深层副本(数组分配的默认值),而{{1 }是对$c
的引用。关键是数组是值,而不是引用。
因此,您的错误似乎可能是缺少$a
,或者是对数组/对象分配如何工作的误解。 (实际上两者都是。)
答案 4 :(得分:0)
我知道这是一个旧线程,但是我遇到了它,试图解决与原始评论者相同的问题。最终,实际答案是点点滴滴地接受的答案,但没有明确说明。
这是最终给我正确答案的链接:http://www.nusphere.com/kb/phpmanual/function.unset.htm?
函数内部unset()的行为可能会有所不同,具体取决于 您要破坏的变量类型。
如果函数内未设置全局变量,则 本地变量被破坏。调用环境中的变量 将保留与调用unset()之前相同的值。
如果您想取消设置()函数内部的全局变量, 您可以使用$ GLOBALS数组执行此操作。
实际答案应如下所示:
function clearArray() {
global $myArray;
unset($GLOBALS['myArray']);
$myArray =array();
}