如何“真正”清除全局PHP数组

时间:2013-08-13 09:04:14

标签: php

注意:似乎我对发生的事情错了,使用$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] );
  }
}

但这似乎很丑陋而且不清楚。有更好的解决方案吗?

5 个答案:

答案 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();
}