保持键不变的情况下,从数组中删除所有的值

39

我真的需要这样做来重置数组吗?

foreach ($array as $i => $value) {
    unset($array[$i]);
}

编辑:

这个更有意义,因为之前的代码等同于$array=array();

foreach ($array as $i => $value) {
    $array[$i]=NULL;
}

2
array_map(function () { return ''; }, $array) - caw
请参阅:Python 的等效问题和答案 https://dev59.com/A2Ag5IYBdhLWcg3w7u2k - dreftymac
@jfoucher 如果您还在,请拒绝我的答案并接受一个更合适的答案。 - aefxx
13个回答

53
$keys = array_keys($array);
$values = array_fill(0, count($keys), null);
$new_array = array_combine($keys, $values);

获取键
获取具有相同元素数量的空数组
使用键和空值将它们组合起来
正如评论所建议的那样,在PHP 5.2中很容易实现,使用array_fill_keys函数
$new_array = array_fill_keys(array_keys($array), null);

6
+1,这些函数经常很有用。从PHP 5.2开始,甚至有了 array_fill_keys() 函数。 - Inshallah
1
+1,上述两种解决方案都更快,其中array_combine是最好的。 - FMCorz
@DamithRuwan 现在谁还在使用 PHP <= 5.2 呢 :D - Epoc

33

使用旧键和空值填充数组

$array = array_fill_keys(array_keys($array), null)


3
根据OP的问题,不清楚这是否是他实际想要的 - 而这正是我想要的,所以对于提供最简单/最短可能的解决方案,给予+1的支持。 - mindplay.dk

13

没有内置函数可以将数组重置为仅包含键。

另一种方法是通过回调函数和 array_map()

$array = array( 'a' => 'foo', 'b' => 'bar', 'c' => 'baz' );

使用常规的回调函数

function nullify() {}
$array = array_map('nullify', $array);

在 PHP <5.3 中,您可以使用 Lambda 表达式。

$array = array_map(create_function('', ''), $array);

自 PHP 5.3 起,也可以使用 lambda 表达式。

$array = array_map(function() {}, $array);
在所有情况下 var_dump($array); 输出:
array(3) {
  ["a"]=> NULL
  ["b"]=> NULL
  ["c"]=> NULL
}

@stereofrog 对的,我已经修改了这些函数。并不是说使用 body 和 argument 是错误的,但为什么要增加混乱呢... 谢谢。 - Gordon
array_fill_keys()仍然是更简单/KISS的解决方案。虽然我也喜欢lambda版本。 - stamster

10

定义此函数并在需要时调用它:

function erase_val(&$myarr) {
    $myarr = array_map(create_function('$n', 'return null;'), $myarr);
}

// It's call by reference so you don't need to assign your array to a variable.
// Just call the function upon it
erase_val($array);

这就是全部内容!


11
很抱歉,这绝对是发布的最差答案 - create_function() 基本上等同于 eval(),绝不能用来解决如此微不足道的问题。另外,为此创建一个函数也完全过度。在我看来,这不应该成为被接受的答案。 - mindplay.dk
2
@mindplay.dk 这个回答已经过时了。它是在这种情况下实现这些事情的最可靠方式。那时候大多数网络主机仍然使用 PHP v5.0。让我们称之为历史的一部分。 - feeela
@feeela 一段历史...确实如此,但仍然过时。 - aefxx
@aefxx 正确,但“过时”和“迄今为止发布的最差答案”是两种不同的评级... - feeela

6
获取数组键,然后使用它们创建一个具有NULL值的新数组:
array_fill_keys(array_keys($array), NULL);

关于 array_fill_keys() 函数:

array_fill_keys() 函数使用指定的键填充数组。

关于 array_keys() 函数:

array_keys() 函数返回数组中所有的键。


2
foreach($a as &$v)
   $v = null;

将数组项设置为null的原因是,数组需要为每个键设置一个值,否则该键就没有意义。这就是为什么它被称为键 - 它用于访问值。在这里使用null值似乎是一个合理的选择。

将其包装在[可重复使用的]过程中:

function array_purge_values(&$a) {
    foreach($a as &$v)
       $v = null;
}

请记住,PHP 5.3及以后版本默认按引用传递函数参数,即在函数声明中前置变量的&符号是多余的。 不仅如此,你还会收到一个关于这种做法已被弃用的警告。


1
简单易懂,但不可重用。这样的代码很糟糕。抱歉。 - aefxx
@aefxx 然后将其包装成一个函数,并用另一个用户空间函数的气味污染全局范围。 - Gordon
@Gordon他可以轻松地将其放入实用程序类中,并从那里静态调用它-没有全局范围污染。@amn好吧,你的代码肯定能解决问题。但最有可能的是,程序员不会在每次需要时都注释为什么要进行空值处理。因此,实现可重用函数并注释其用途(而不是它所做的事情,这是显而易见的)是最佳实践。除此之外,它更容易出错,因为程序员每次编写该代码片段时都可能出错(虽然在这里不太可能,但你可以理解这个概念)。 - aefxx
@aefx 是的。他本来可以这样做。你在回答中也可以这样做。但是你没有。关键是:@amn 给出了一个解决问题的有效方案。他“奥卡姆剃刀”地省略了与解决方案无关的所有内容。而你告诉他他的解决方案很糟糕。这太荒谬了。OP 没有要求可重用性,并且他自己使用了 foreach - Gordon
1
@aefxx 如果你想分享超出实际问题的见解,那么我们鼓励你这样做,但不要仅仅因为别人选择不这样做就告诉他们他们的答案很烂。特别是当答案完全有效时。此外,我认为暗示OP显然无法将foreach循环包装到函数中或者他无法表达像可重用性这样的日常概念是相当冒犯和傲慢的。 - Gordon
显示剩余2条评论

1

如果您需要将一个关联数组的所有值置为空,可以遍历整个数组并回调将值设置为空,从而保留键。

array_walk($ar,function(&$item){$item = null;});

如果需要将整个数组清空,只需将其重新赋值为空即可。
$ar = array();

0

这是一个相当古老的话题,但由于在想出自己更具体的解决方案之前我参考了它,所以我将与您分享该解决方案。

期望的结果是将所有值置空,同时保留键,并且递归地搜索子数组。

递归设置多级数组值为空:

function nullifyArray(&$arrayData) {

  if (is_array($arrayData)) {
    foreach ($arrayData as $aKey => &$aValue) {
      if (is_array($aValue)) {
        nullifyArray($aValue);
      } else {
        $aValue = null;
      }
    }
    return true;     // $arrayData IS an array, and has been processed.
  } else {
    return false;    // $arrayData is NOT an array, no action(s) were performed.
  }

}

这是它的使用方法,以及数组内容BEFOREAFTER输出。

创建多级数组并调用nullifyArray()函数的PHP代码:

// Create a multi-level array.
$testArray = array(
    'rootKey1'              =>  'rootValue1',
    'rootKey2'              =>  'rootValue2',
    'rootArray1'            =>  array(
        'subKey1'           =>  'subValue1',
        'subArray1'         =>  array(
            'subSubKey1'    =>  'subSubValue1',
            'subSubKey2'    =>  'subSubValue2'
        )
    )
);

// Nullify the values.
nullifyArray($testArray); 

调用 nullifyArray() 之前:

Array
(
    [rootKey1] => rootValue1
    [rootKey2] => rootValue2
    [rootArray1] => Array
        (
            [subKey1] => subValue1
            [subArray1] => Array
                (
                    [subSubKey1] => subSubValue1
                    [subSubKey2] => subSubValue2
                )

        )

)

调用 nullifyArray() 后:

Array
(
    [rootKey1] => 
    [rootKey2] => 
    [rootArray1] => Array
        (
            [subKey1] => 
            [subArray1] => Array
                (
                    [subSubKey1] => 
                    [subSubKey2] => 
                )

        )

)

希望它能帮助到某个人/任何人,感谢之前回答问题的所有人。


0

我不太明白问题,但是你的例子

foreach ($array as $i => $value) {
    unset($array[$i]);
}

等同于

$array = array();

是的,没错,键也会被删除... 我想要一个内置函数来做到这一点:foreach ($array as $i => $value) { $array[$i]=NULL; } - jfoucher

0
为什么不创建一个带有所需键的数组,并在需要重置时将其分配给变量?
function resetMyArr(&$arr)
{
 $arr = array('key1'=>null,'key2'=>null); 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接