首页 文章

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

提问于
浏览
71

我只是使用array_filter从数组中删除只有值''的条目,现在我想根据从0开始的占位符对它应用某些转换,但不幸的是它仍然保留原始索引 . 我找了一会儿,看不到任何东西,也许我只是错过了明显的,但我的问题是......

如何轻松地重置数组的索引从0开始并按顺序在新数组中,而不是保留旧索引?

4 回答

  • 161

    使用 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
    
  • 8

    I worry about how many programmers have innocently copy/pasted the array_values(array_filter()) method into their codes - 我想知道有多少程序员因为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 => '',
    )
    

    使用我的方法,您可以获得重新索引的键,所有非空值以及任何空值 . 一个干净,便携,可靠的单线程,可满足您的所有阵列空值过滤需求 . 这是demonstration .



    同样,如果要删除empty,false和null元素(保留零),这四种方法将起作用:

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

    如果在数组上调用array_values,它将从零重新编制索引 .

  • 19

    如果您使用阵列过滤器,请执行以下操作

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

相关问题