2010-08-04 48 views
52

开始我只是用array_filter删除从一个数组只有价值'的条目,现在我想在它应用某些转换后取决于从0开始的占位符,但不幸的是它仍然保留了原始索引。我看了一会儿,什么也看不到,也许我只是错过了显而易见的,但我的问题是...array_filter(),我怎么能重置键去按数字顺序在0

我怎样才能轻松重置数组的索引从0开始,并去,才能在NEW数组,而不是让它保留旧索引?

+0

[PHP数组\ _filter无键保存](的可能的复制http://stackoverflow.com/questions/2653017/php-array-filter-没有键保存) – 2016-03-22 03:42:37

+0

除非你完全确定你的数组中没有任何empty/zero-ish/falsey值,否则我必须敦促你不要使用'array_filter()' - 你可能会比你清除更多打算。下面是演示的一些解释:http://stackoverflow.com/a/43657056/2943403 – mickmackusa 2017-04-29 09:36:47

回答

126

如果你打电话array_values阵列上,它会从零重建索引。

+5

非常烦人,我必须等待批准你的答案。 – jel402 2010-08-04 01:03:26

5

使用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 
12

如果使用滤镜阵列做如下

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

哦,我已经失去了试图弄清楚为什么json_encode数组的结果不同于json_encode array_filtered数组的结果...谢谢你很多... – Jerther 2015-10-25 00:40:27

3

我担心的是许多程序员都傻傻地复制/粘贴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 => '', 
) 

用我的方法,你让你重新索引键,所有非空值,以及没有任何空值。一个干净,便携,可靠的单线程用于您的所有阵列空过滤需求。这是一个demonstration



同样,如果你想删除空,假的,空元素(保持零),这四种方法将工作:

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', 
)