【问题标题】:php array_filter without key preservationphp array_filter 没有密钥保存
【发布时间】:2011-02-08 19:53:15
【问题描述】:

如果我使用 array_filter 过滤数组以消除空值,则保留键并在数组中生成“洞”。例如:

The filtered version of
    [0] => 'foo'
    [1] =>  null
    [2] => 'bar'
is 
    [0] => 'foo'
    [2] => 'bar'

我怎样才能得到,而不是

[0] => 'foo'
[1] => 'bar'

?

【问题讨论】:

标签: php arrays


【解决方案1】:

您可以在过滤后使用array_values 来获取值。

【讨论】:

    【解决方案2】:

    使用这个输入:

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

    有几种方法可以做到这一点。 Demo

    提出array_filter 的贪婪默认行为有点离题,但如果您正在谷歌搜索此页面,这可能是与您的项目/任务相关的重要信息:

    var_export(array_values(array_filter($array)));  // NOT GOOD!!!!!
    

    输出错误:

    array (
      0 => 'foo',
      1 => 'bar',
    )
    

    现在介绍可行的方法:

    方法#1:(array_values()array_filter() w/!is_null()

    var_export(array_values(array_filter($array,function($v){return !is_null($v);})));  // good
    

    方法#2:(foreach(),自动索引数组,!==null

    foreach($array as $v){
        if($v!==null){$result[]=$v;}
    }
    var_export($result);  // good
    

    方法#3:(array_walk(),自动索引数组,!is_null()

    array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}});
    var_export($filtered);  // good
    

    所有三种方法都提供以下“无空”输出:

    array (
      0 => 'foo',
      1 => 'bar',
      2 => 0,
      3 => false,
      4 => '0',
      5 => '',
    )
    

    从 PHP7.4 开始,您甚至可以像这样执行“重新打包”:(splat 运算符需要数字键)

    代码:(Demo)

    $array = ['foo', NULL, 'bar', 0, false, null, '0', ''];
    
    $array = [...array_filter($array)];
    
    var_export($array);
    

    输出:

    array (
      0 => 'foo',
      1 => 'bar',
    )
    

    ...但事实证明,使用 splat 运算符 is far less efficient “重新打包”而不是调用 array_values()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      • 2011-11-17
      • 1970-01-01
      • 2015-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多