在array_filter()之后,我如何重置键以从0开始按数字顺序排列

Posted

技术标签:

【中文标题】在array_filter()之后,我如何重置键以从0开始按数字顺序排列【英文标题】:After array_filter(), how can I reset the keys to go in numerical order starting at 0 【发布时间】:2011-03-25 00:44:03 【问题描述】:

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

如何轻松地将数组的索引重置为从 0 开始并在 NEW 数组中按顺序排列,而不是让它保留旧索引?

【问题讨论】:

php array_filter without key preservation的可能重复 除非你绝对确定你的数组中没有任何空值/零值/假值,否则我必须敦促你不要使用array_filter()——你可能会清除比你想要的更多到。以下是一些带有演示的解释:***.com/a/43657056/2943403 【参考方案1】:

如果您在数组上调用array_values,它将从零开始重新索引。

【讨论】:

链接失效,请改用php.net/manual/en/function.array-values.php。我无法更新它,因为我需要更改至少 6 个字符。【参考方案2】:

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

【讨论】:

【参考方案3】:

如果您使用的是数组过滤器,请按以下方式操作

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

【讨论】:

【参考方案4】:

我担心有多少程序员无意中将array_values(array_filter()) 方法复制/粘贴到他们的代码中——我想知道有多少程序员因为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。



同样,如果要删除空、假和空元素(保留零),这四种方法都可以:

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

【讨论】:

如果你写array_values(array_filter($arr, function($el) return $el !== '';)),事情会不会完全按照预期的方式运行?这似乎是执行 OP 所要求的自然方式。 是的。我的观点是开发人员应该避免使用array_filter() 的默认行为的冲动,除非他们对数据的深入了解允许无副作用的贪婪过滤。 (进一步的警告:empty() 的行为方式相同,并且在其贪婪中还包含一个空数组。) 这个回复回答了完全不同的问题,与原来的问题没有任何关系,形状或形式。 array_filter() 的行为与手册中所说的完全一样:php.net/manual/en/function.array-filter.php“如果未提供回调,则数组的所有条目都等于 FALSE(请参阅转换为布尔值)将被删除。” PHP 程序员应该知道,0、null、false、'' 和 '0' 在强制为布尔值时都会评估为 false。 事实是,大多数人不知道会发生什么。你有,我有,但很多人没有。我发布这个答案是为了帮助不知道的人。

以上是关于在array_filter()之后,我如何重置键以从0开始按数字顺序排列的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 根据键值删除数组内的对象 - array_filter

如何使主键以特定字母开头?

如何删除数组中的空元素[重复]

python - “将重新索引布尔系列键以匹配DataFrame索引。来自ipykernel导入kernelapp作为app“

vcenter 密码重置(6.5为例)

如何绑定转义键以关闭此窗口