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

jel*_*402 93 php arrays filter reindex

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

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

Dan*_*uis 200

如果你调用array_values你的数组,它将从零重新索引.

  • 该链接不再有效,请改用 http://php.net/manual/en/function.array-values.php 。我无法更新它,因为我需要更改至少 6 个字符。 (3认同)

use*_*143 31

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

$NewArray = array_values(array_filter($OldArray));
Run Code Online (Sandbox Code Playgroud)

  • 噢,我迷失在试图弄清楚为什么json_encode一个数组的结果与json_encode一个array_filtered数组的结果不同的时候……谢谢你…… (2认同)

Ed *_*zur 11

用途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
Run Code Online (Sandbox Code Playgroud)


mic*_*usa 10

我担心有array_values(array_filter())多少程序员无意中方法复制/粘贴到他们的代码中 - 我想知道有多少程序员因为array_filter的贪婪而不知不觉地遇到了问题.或者更糟糕的是,有多少人从未发现该函数从数组中清除了太多的值...

我将为NULL从数组中剥离元素并重新索引键的两部分过程提供更好的替代方法.

然而,首先,我强调贪婪的性质array_filter()以及如何能够默默地为你的项目提供动力,这一点非常重要.这是一个包含混合值的数组,它将暴露出麻烦:

$array=['foo',NULL,'bar',0,false,null,'0',''];
Run Code Online (Sandbox Code Playgroud)

无论大写/小写如何,都将删除空值.

但是当我们使用array_values()array_filter()时,请查看数组中剩余的内容:

array_values(array_filter($array));
Run Code Online (Sandbox Code Playgroud)

输出数组($ array):

array (
  0 => 'foo',
  1 => 'bar'
)
// All empty, zero-ish, falsey values were removed too!!!
Run Code Online (Sandbox Code Playgroud)

现在看一下使用array_walk()&is_null()生成新过滤数组的方法得到的结果:

array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}});
Run Code Online (Sandbox Code Playgroud)

这可以写在多行上,以便于阅读/解释:

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
        }
    }
);
Run Code Online (Sandbox Code Playgroud)

输出数组($ filter):

array (
  0 => 'foo',
  1 => 'bar',
  2 => 0,
  3 => false,
  4 => '0',
  5 => '',
)
Run Code Online (Sandbox Code Playgroud)

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



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

var_export(array_values(array_diff($array,[''])));
Run Code Online (Sandbox Code Playgroud)

要么

var_export(array_values(array_diff($array,[null])));
Run Code Online (Sandbox Code Playgroud)

要么

var_export(array_values(array_diff($array,[false])));
Run Code Online (Sandbox Code Playgroud)

要么

var_export(array_values(array_filter($array,'strlen')));
Run Code Online (Sandbox Code Playgroud)

输出:

array (
  0 => 'foo',
  1 => 'bar',
  2 => 0,
  3 => '0',
)
Run Code Online (Sandbox Code Playgroud)

最后,对于任何喜欢语言结构语法的人,您也可以将限定值推送到新数组中以发布新索引.

$array=['foo', NULL, 'bar', 0, false, null, '0', ''];

$result = [];
foreach ($array as $value) {
    if (strlen($value)) {
        $result[] = $value;
    }
}

var_export($result);
Run Code Online (Sandbox Code Playgroud)

  • 如果你写`array_values(array_filter($ arr,function($ el){return $ el!=='';}})`,事情是否会以完全预期的方式运行?这似乎是做OP所要求的自然方式. (2认同)
  • 该答复回答了完全不同的问题,无论以任何形式,形式或形式都与原始问题无关。 (2认同)
  • `array_filter()` 的行为与您在手册中所说的完全一样:http://php.net/manual/en/function.array-filter.php“如果没有提供回调,所有条目等于 FALSE 的数组(请参阅转换为布尔值)将被删除。” PHP 程序员应该知道,0、null、false、'' 和 '0' 在强制为布尔值时都会评估为 false。 (2认同)