删除数组中的所有值,同时保持键完好无损

时间:2010-02-07 15:05:12

标签: php arrays

我真的必须这样做才能重置阵列吗?

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

编辑:

这个更有意义,因为前一个相当于$array=array();

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

13 个答案:

答案 0 :(得分:47)

$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);

答案 1 :(得分:24)

使用旧键和空值填充数组

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

答案 2 :(得分:11)

定义此功能并在需要时调用它:

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);

这就是全部!

答案 3 :(得分:9)

没有内置函数可以将数组重置为它的键。

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

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

使用常规回调功能

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

或者使用带有PHP的lambda< 5.3

$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
}

答案 4 :(得分:2)

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

将数组项设置为null背后的原因是数组需要为每个键设置一个值,否则键无关紧要。这就是它被称为密钥的原因 - 它用于访问一个值。这里的空值似乎是一个合理的选择。

将其包裹在[可重复使用]程序中:

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

请记住,从5.3开始的PHP版本默认情况下通过引用将值传递给函数,即函数声明中的&符号前置参数变量是多余的。 不仅如此,您还会收到一个警告,即该概念已被弃用。

答案 5 :(得分:2)

翻转数组以获取键,然后为所有键赋予值NULL:

array_fill_keys(array_flip($array), NULL);

关于array_fill_keys():

  

array_fill_keys()函数用值填充数组,指定   键。

关于array_flip():

  

array_flip()函数使用其键来翻转/交换所有键   数组中的关联值。

答案 6 :(得分:1)

我没有很好地回答这个问题,但是你的例子

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

等同于

$array = array();

答案 7 :(得分:1)

如果需要使关联数组的值无效,则可以遍历整个数组并进行回调以将值设置为null,从而仍然具有键

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

如果您需要使整个数组无效,只需将其重新分配为空

$ar = array();

答案 8 :(得分:0)

unset将删除密钥,您需要根据您的要求将值设置为null或0。

Example

答案 9 :(得分:0)

这样做:

$arrayWithKeysOnly = array_keys($array);

http://php.net/manual/en/function.array-keys.php

编辑:发表评论:

好的,然后这样做:

$arrayWithKeysProper = array_flip(array_keys($array));

http://www.php.net/manual/en/function.array-flip.php

编辑:实际上在考虑它,这可能也行不通。

答案 10 :(得分:0)

为什么不使用所需的键创建一个数组,并在需要重置时将其分配给变量?

function resetMyArr(&$arr)
{
 $arr = array('key1'=>null,'key2'=>null); 
}

答案 11 :(得分: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.
  }

}

这里是正在使用的,以及数组内容的 BEFORE AFTER 输出。

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

// 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] => 
                )

        )

)

我希望它可以帮助某人/任何人,并感谢所有之前回答过问题的人。

答案 12 :(得分:0)

和速度测试 此测试显示清除大型阵列时的速度

$a1 = array();
for($i=0;$i<=1000;$i++)
{
    $a1['a'.$i] = $i;
}
$b = $a1;
$start_time = microtime(TRUE);
    foreach ($a1 as $field => $val) {
      $a1[$field]=NULL;
    } 
$end_time = microtime(TRUE);
$duration = $end_time - $start_time;
var_dump( $duration*1000 );

var_dump('all emelent of array is '.reset($a1));


$start_time = microtime(TRUE);
$allkeys = array_keys($b);
$newarray = array_fill_keys($allkeys, null);

$end_time = microtime(TRUE);
$duration = $end_time - $start_time;
var_dump( $duration*1000 );

var_dump('all emelent of array is '.reset($newarray));