【问题标题】:Remove NULL, FALSE, and '' - but not 0 - from a PHP array从 PHP 数组中删除 NULL、FALSE 和 '' - 但不是 0 -
【发布时间】:2012-12-17 12:37:18
【问题描述】:

我想删除 NULLFALSE'' 值。

我使用了array_filter,但它也删除了0

有什么功能可以做我想做的事吗?

array(NULL,FALSE,'',0,1) -> array(0,1)

【问题讨论】:

    标签: php arrays array-filter


    【解决方案1】:

    您也可以将array_filter'strlen' 参数一起使用:

    // removes all NULL, FALSE and Empty Strings but leaves 0 (zero) values
    $result = array_filter($array, 'strlen');
    

    https://www.php.net/manual/en/function.array-filter.php#111091

    【讨论】:

    • 如果您的数组包含其他数组,则会引发错误。
    • 从 PHP 8.1 开始,strlen 现在会发出一个不推荐使用的错误“strlen(): Passing null to parameter #1 ($string) of string is deprecated”
    【解决方案2】:

    如果您使用identical comparison operatorarray_filter 应该可以正常工作。

    here's an example

    $values = [NULL, FALSE, '', 0, 1];
    
    function myFilter($var){
      return ($var !== NULL && $var !== FALSE && $var !== '');
    }
    
    $res = array_filter($values, 'myFilter');
    

    或者如果不想定义过滤函数,也可以使用匿名函数(闭包):

    $res = array_filter($values, function($value) {
        return ($value !== null && $value !== false && $value !== ''); 
    });
    

    如果您只需要数值,可以使用is_numeric 作为回调:example

    $res = array_filter($values, 'is_numeric');
    

    【讨论】:

    • 第二个例子有点危险,因为你不知道 OP 过滤的是什么类型的数据。该过滤器将删除的不仅仅是 NULLFALSE""
    • true,在答案中添加了注释。
    【解决方案3】:

    来自http://php.net/manual/en/function.array-filter.php#111091

    如果要删除 NULL、FALSE 和空字符串,但保留值为 0,则可以使用 strlen 作为回调函数:

    array_filter($array, 'strlen');
    

    【讨论】:

    • 这确实有效,因为 strlen() 将其参数转换为字符串,因此 0 和 1 变为“0”和“1”,而 null 和 false 变为“”。
    • 天才!请注意,对象和数组也会被删除,并且 strlen 会抛出有关它们的警告。
    • 从 PHP 8.1 开始,strlen 现在将发出一个不推荐使用的错误“strlen(): Passing null to parameter #1 ($string) of string is deprecated”
    【解决方案4】:

    单线总是很好。

    $clean_array = array_diff(array_map('trim', $my_array), array('', NULL, FALSE));
    

    说明:

    • array_diff 的第一个参数: $my_array 的修剪版本。使用array_map,通过trim 函数从每个元素中修剪周围的空白。如果元素包含的字符串只是空格(即制表符、空格),最好使用修剪后的版本,我假设它也希望被删除。如果您不想修剪元素,也可以轻松地将 $my_array 用作第一个参数。
    • array_diff 的第二个参数:要从 $my_array 中删除的项目数组。
    • 输出: 包含在第一个数组中但不包含在第二个数组中的元素数组。在这种情况下,因为''NULLFALSE 在第二个数组中,所以array_diff 永远无法返回它们。

    编辑:

    事实证明,您不需要在第二个数组中包含 NULLFALSE。相反,您可以只使用'',它会以相同的方式工作:

    $clean_array = array_diff(array_map('trim', $my_array), array(''));
    

    【讨论】:

      【解决方案5】:

      检查它是否小于1,如果大于-1,则不要删除它...

      $arrayValue = (NULL,FALSE,'',0,1);
      $newArray = array();
      foreach($arrayValue as $value) {
          if(is_int($value) || ($value>-1 && $value <1)) {
              $newArray[] = $value;
          }
      }
      
      print_r($newArray);
      

      【讨论】:

      • 如果是array(NULL,FALSE,'hello world')呢?
      • 他里面会有字符/字符串吗?
      【解决方案6】:

      array_filter 不起作用,因为默认情况下,它会删除任何与 FALSE 等效的内容,并且 PHP 认为 0 等效于 false。 PHP manual 在这个问题上有这样的说法:

      当转换为布尔值时,以下值被视为 FALSE:

      • 布尔值 FALSE 本身
      • 整数 0(零)
      • 浮点数 0.0(零)
      • 空字符串和字符串“0”
      • 零元素的数组
      • 一个成员变量为零的对象(仅限 PHP 4)
      • 特殊类型 NULL(包括未设置的变量)
      • 从空标签创建的 SimpleXML 对象

      所有其他值都被视为 TRUE(包括任何资源)。

      您可以将第二个参数传递给array_filter,并回调您自己编写的函数,该函数告诉array_filter 是否删除该项目。

      假设您要删除所有与 FALSE 等效的值除了零,这是一个易于编写的函数:

      function RemoveFalseButNotZero($value) {
        return ($value || is_numeric($value));
      }
      

      然后你只需用过滤后的数组覆盖原始数组:

      $array = array_filter($array, "RemoveFalseButNotZero");
      

      【讨论】:

      • 或者如果你喜欢 lambdas:$array= array_filter($array, function($val) { return ($val || is_numeric($val));});
      • @bmewburn 您需要删除否定。如果您想保留该值,回调将返回 TRUE。我最初写答案时记错了。
      【解决方案7】:
      function ExtArray($linksArray){
          foreach ($linksArray as $key => $link)
          {
              if ($linksArray[$key] == '' || $linksArray[$key] == NULL || $linksArray[$key] == FALSE || $linksArray[$key] == '')
              {
                  unset($linksArray[$key]);
              }else {
                  return $linksArray[$key];
              }
          }
      }
      

      这个功能可以帮到你

      【讨论】:

      • 这很难看,它会遇到与 OP 相同的问题。您必须使用identical comparison operator。好的解决方案最多只有 3 行,你甚至不必定义一个函数。
      【解决方案8】:
      function my_filter($var)
      {
          // returns values that are neither false nor null (but can be 0)
          return ($var !== false && $var !== null && $var !== '');
      }
      
      $entry = array(
                   0 => 'foo',
                   1 => false,
                   2 => -1,
                   3 => null,
                   4 => '',
                   5 => 0
                );
      
      print_r(array_filter($entry, 'my_filter'));
      

      输出:

      Array
      (
          [0] => foo
          [2] => -1
          [5] => 0
      )
      

      【讨论】:

        【解决方案9】:

        使用带有 array_filter 的自定义回调函数。请参阅此示例,从 PHP 手册中提取,了解如何使用回调函数。示例中的回调函数是基于奇/偶的过滤;您可以编写一个小函数来根据您的要求进行过滤。

        <?php
        function odd($var)
        {
            // returns whether the input integer is odd
            return($var & 1);
        }
        
        function even($var)
        {
            // returns whether the input integer is even
            return(!($var & 1));
        }
        
        $array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);
        $array2 = array(6, 7, 8, 9, 10, 11, 12);
        
        echo "Odd :\n";
        print_r(array_filter($array1, "odd"));
        echo "Even:\n";
        print_r(array_filter($array2, "even"));
        ?> 
        

        【讨论】:

        • 我不知道为什么这被否决了 :( 好吧,也许回调函数可以用不同的方式编写,也许它可以使用帖子中的数据,但它可能显示了一个用法没有被 OP 考虑。(我自己没有选票..)
        • 它没有显示确切的回电,因为我没有心情用勺子喂食。答案本身说'示例中的回调函数是基于奇/偶过滤;您可以编写一个小函数来根据您的要求进行过滤。并且我从 PHP 手册中删除了它。
        猜你喜欢
        • 2016-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-29
        • 1970-01-01
        • 2021-11-24
        • 2012-11-07
        • 2011-10-25
        相关资源
        最近更新 更多