0

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

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

4

5 回答 5

8

不要忘记有两种访问全局变量的方法:

function clearArray() {
    unset($GLOBALS['myArray']);
}
于 2013-08-13T09:07:46.233 回答
1

使用$myArray=array(); unset($myArray); 确实有效的通常建议。

于 2013-08-13T09:07:48.457 回答
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
(
)
于 2013-08-13T09:12:41.643 回答
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未清除,while $bis,是(数组赋值的默认设置)$c的深层副本,while是对. 关键是数组是值,而不是引用。$a$c$a

因此,您的错误似乎可能是global对数组/对象分配的工作方式的缺失或误解。(实际上两者都是。)

于 2013-08-14T01:40:18.410 回答
0

我知道这是一个旧线程,但我发现它试图解决与原始评论者相同的问题。最终,实际答案是被接受的答案的点点滴滴,但从未明确说明过。

这是最终给了我正确答案的链接: http ://www.nusphere.com/kb/phpmanual/function.unset.htm ?

函数内部 unset() 的行为可能因您尝试销毁的变量类型而异。

如果全局变量在函数内部是 unset() ,则只有局部变量被破坏。调用环境中的变量将保留与调用 unset() 之前相同的值。

如果您想在函数内取消设置()全局变量, 可以使用 $GLOBALS 数组来执行此操作。

实际答案应如下所示:

function clearArray() {
  global $myArray;
  unset($GLOBALS['myArray']);
  $myArray =array();
}
于 2018-06-22T21:38:26.410 回答