我真的必须这样做才能重置阵列吗?
foreach ($array as $i => $value) {
unset($array[$i]);
}
编辑:
这个更有意义,因为前一个相当于$array=array();
foreach ($array as $i => $value) {
$array[$i]=NULL;
}
答案 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。
答案 9 :(得分:0)
这样做:
$arrayWithKeysOnly = array_keys($array);
http://php.net/manual/en/function.array-keys.php
编辑:发表评论:
好的,然后这样做:
$arrayWithKeysProper = array_flip(array_keys($array));
编辑:实际上在考虑它,这可能也行不通。
答案 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));