在 array_filter()之后,如何重置键以数字顺序从0开始

我只是使用 array _ filter 从数组中删除只有值的条目,现在我想根据从0开始的占位符对其应用某些转换,但不幸的是它仍然保留原始索引。我找了一会儿,什么也没找到也许我只是忽略了显而易见的事实但我的问题是。

如何轻松地将数组的索引重置为从0开始并按照 NEW 数组中的顺序排列,而不是让它保留旧的索引?

75661 次浏览

如果对数组调用 array_values,它将从零开始重新索引。

使用 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 过滤器,请按照以下步骤操作

$NewArray = array_values(array_filter($OldArray));

我担心有多少程序员天真地将 array_values(array_filter())方法复制/粘贴到他们的代码 中——我想知道有多少程序员因为 array _ filter 的贪婪而不知不觉地遇到了问题。或者更糟糕的是,有多少人从未发现函数从数组中清除了太多的值..。

我将为从数组中剥离 NULL元素和重新索引键这两部分过程提供一个更好的替代方案。

然而,首先,我要强调的是 array_filter()的贪婪本性,以及它是如何悄无声息地扭曲你的项目的,这一点非常重要。下面是一个包含混合值的数组,它将暴露问题:

$array=['foo',NULL,'bar',0,false,null,'0',''];

无论大小写,空值都将被移除。

但是看看当我们使用 Array _ values ()Array _ filter ()时,数组中还剩下什么:

array_values(array_filter($array));

输出数组($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
}
}
);

输出数组($filter) :

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