array_filter()后,我怎么能重置键去按数字顺序从0开始
题
我只是用array_filter以除去从数组只有值“”的条目,现在我想根据从0开始的占位符上其应用于某些转换,但不幸的是它仍保留原始索引。我看了一会儿,什么也看不到,也许我只是错过了显而易见的,但我的问题是...
我怎样才能轻松重置数组的索引从0开始,并去,以新的数组中,而不是把它留住老索引?
解决方案
如果你调用 array_values
阵列上,它会从零重新索引。
其他提示
如果使用的是阵列滤波器做到这一点如下
$NewArray = array_values(array_filter($OldArray));
使用array_values()
:
<?php
$array = array('foo', 'bar', 'baz');
$array = array_filter($array, function ($var) {
return $var !== 'bar';
});
print_r($array); // indexes 0 and 2
print_r(array_values($array)); // indexes 0 and 1
我担心的是许多程序员都傻傻地复制/粘贴array_values(array_filter())
方法到他们的代码 - 我不知道有多少程序员无意中碰到了因为array_filter的贪婪的问题。更糟的是,有多少人从来没有发现,从功能的阵列清除值太多......
我将提供一个更好的选择为从阵列和重新索引键剥离NULL
元件的过程分为两个部分。
然而,首先,这是非常重要的,我强调array_filter()
的贪婪的本性和如何能默默monkeywrench项目。下面是与它混合值的数组,将暴露的麻烦:
$array=['foo',NULL,'bar',0,false,null,'0',''];
空值时将忽略大写的去除/小写。
但看看我们仍当我们使用 array_values()数组中的& array_filter():
array_values(array_filter($array));
输出阵列($阵列):
array (
0 => 'foo',
1 => 'bar'
)
// All empty, zero-ish, falsey values were removed too!!!
现在看看你有我的方法得到的使用 array_walk()& is_null()以生成一个新的过滤数组:
array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}});
这可以写多行更容易阅读/说明:
array_walk( // iterate each element of an input array
$array, // this is the input array
function($v)use(&$filtered){ // $v is each value, $filter (output) is declared/modifiable
if(!is_null($v)){ // this literally checks for null values
$filtered[]=$v; // value is pushed into output with new indexes
}
}
);
输出阵列($滤波器):
array (
0 => 'foo',
1 => 'bar',
2 => 0,
3 => false,
4 => '0',
5 => '',
)
使用我的方法,你让你重新索引键,所有的非空值,并且没有空值的。干净,携带方便,可靠的班轮为您所有的阵列空滤需要。这里是一个示范。
同样,如果你想删除空,假的,空元素(保持零),这四种方法将工作:
var_export(array_values(array_diff($array,[''])));
或
var_export(array_values(array_diff($array,[null])));
或
var_export(array_values(array_diff($array,[false])));
或
var_export(array_values(array_filter($array,'strlen')));
输出:
array (
0 => 'foo',
1 => 'bar',
2 => 0,
3 => '0',
)
最后,对于任何人谁喜欢的语言结构的语法,你也可以只推合格值到一个新的阵列发出新的索引。
$array=['foo', NULL, 'bar', 0, false, null, '0', ''];
$result = [];
foreach ($array as $value) {
if (strlen($value)) {
$result[] = $value;
}
}
var_export($result);