开始我只是用array_filter删除从一个数组只有价值'的条目,现在我想在它应用某些转换后取决于从0开始的占位符,但不幸的是它仍然保留了原始索引。我看了一会儿,什么也看不到,也许我只是错过了显而易见的,但我的问题是...array_filter(),我怎么能重置键去按数字顺序在0
我怎样才能轻松重置数组的索引从0开始,并去,才能在NEW数组,而不是让它保留旧索引?
开始我只是用array_filter删除从一个数组只有价值'的条目,现在我想在它应用某些转换后取决于从0开始的占位符,但不幸的是它仍然保留了原始索引。我看了一会儿,什么也看不到,也许我只是错过了显而易见的,但我的问题是...array_filter(),我怎么能重置键去按数字顺序在0
我怎样才能轻松重置数组的索引从0开始,并去,才能在NEW数组,而不是让它保留旧索引?
使用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
如果使用滤镜阵列做如下
$NewArray = array_values(array_filter($OldArray));
哦,我已经失去了试图弄清楚为什么json_encode数组的结果不同于json_encode array_filtered数组的结果...谢谢你很多... – Jerther 2015-10-25 00:40:27
我担心的是许多程序员都傻傻地复制/粘贴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',
)
[PHP数组\ _filter无键保存](的可能的复制http://stackoverflow.com/questions/2653017/php-array-filter-没有键保存) – 2016-03-22 03:42:37
除非你完全确定你的数组中没有任何empty/zero-ish/falsey值,否则我必须敦促你不要使用'array_filter()' - 你可能会比你清除更多打算。下面是演示的一些解释:http://stackoverflow.com/a/43657056/2943403 – mickmackusa 2017-04-29 09:36:47