Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在array_filter()之后,如何将键重置为从0开始的数字顺序_Php_Arrays_Filter_Reindex - Fatal编程技术网

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

Php 在array_filter()之后,如何将键重置为从0开始的数字顺序,php,arrays,filter,reindex,Php,Arrays,Filter,Reindex,我刚刚使用array_filter从数组中删除了只有值“”的条目,现在我想根据从0开始的占位符对其应用某些转换,但不幸的是,它仍然保留原始索引。我看了一会儿,什么也看不见,也许我只是错过了显而易见的,但我的问题是 如何轻松地将数组的索引重置为从0开始,并在新数组中按顺序排列,而不是让它保留旧索引?如果调用数组,它将从零重新编制索引。使用数组值() 如果您使用的是数组过滤器,请按如下操作 $NewArray = array_values(array_filter($OldArray)); 我担心

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

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

如果调用数组,它将从零重新编制索引。

使用
数组值()


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

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

我担心有多少程序员天真地将
array\u值(array\u filter())
方法复制/粘贴到他们的代码中
——我想知道有多少程序员因为array\u filter的贪婪而无意中遇到了问题。更糟糕的是,有多少人从未发现函数从数组中清除了太多的值

对于从数组中剥离
NULL
元素并重新索引键的两部分过程,我将提供一个更好的选择

但是,首先,我要强调
array\u filter()
的贪婪本质,以及它如何悄悄地破坏您的项目,这一点非常重要。下面是一个包含混合值的数组,它会暴露问题:

$array=['foo',NULL,'bar',0,false,null,'0',''];
不管大小写,空值都将被删除

但是看看当我们使用&:

输出数组($array):

现在看看我使用&生成新的过滤数组的方法得到了什么:

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

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

使用我的方法,您可以获得重新索引的键、所有非空值和所有空值。一款干净、便携、可靠的一行程序,可满足所有阵列空值过滤需求。这是一本书



类似地,如果要删除空、假和空元素(保留零),这四种方法也可以工作:

var_export(array_values(array_diff($array,[''])));

输出:

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

哦,我花了很多时间试图弄明白为什么json_编码数组的结果与json_编码数组的结果不同。。。非常感谢您…的可能重复项除非您绝对确定数组中没有任何空/零/假值,否则我必须敦促您不要使用
array\u filter()。下面是一个演示的一些解释:如果您编写
array\u值(array\u filter($arr,function($el){return$el!='''';}))
,事情不会以预期的方式运行吗?这似乎是做OP要求的事情的自然方式。是的。我的观点是,开发人员应该避免使用
array\u filter()
的默认行为,除非他们对数据的熟悉程度允许贪婪过滤而没有副作用。(进一步提醒:
empty()
的行为方式与此相同,并且贪婪中还包含一个空数组。)此回答回答完全不同的问题,与原始问题在任何方式、形状或形式上都不相关。
array\u filter()
的行为与手册中所述的行为完全相同:如果未提供回调,则将删除所有等于FALSE的数组项(请参阅转换为布尔值)。PHP程序员应该都知道,0、null、false和“0”在强制为布尔值时都会计算为false。你喜欢,我喜欢,但很多人不喜欢。我发布这个答案是为了帮助那些不知道的人。这个链接不再有效,请改用。我无法更新它,因为我至少需要更改6个字符。
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);