我刚刚使用 array_filter 从数组中删除只有值 '' 的条目,现在我想根据从 0 开始的占位符对其应用某些转换,但不幸的是它仍然保留了原始索引。我看了一会儿,什么也看不到,也许我只是错过了明显的,但我的问题是......
如何轻松地将数组的索引重置为从 0 开始并在 NEW 数组中按顺序排列,而不是让它保留旧索引?
如果你调用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()
以及这如何默默地对您的项目造成影响,这一点非常重要。这是一个包含混合值的数组,它会暴露问题:
$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);