我只是用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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top