从PHP数组中删除NULL,FALSE和'' - 但不是0

时间:2013-01-03 06:22:10

标签: php arrays filter

我想删除NULLFALSE''值。

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

有anty功能可以做我想要的吗?

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

10 个答案:

答案 0 :(得分:42)

如果您使用array_filter

identical comparison operator应该可以正常工作。

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

答案 1 :(得分:34)

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

如果要删除NULL,FALSE和Empty Strings,但保留0的值,可以使用strlen作为回调函数:

array_filter($array, 'strlen');

答案 2 :(得分:5)

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

答案 3 :(得分:2)

使用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"));
?> 

答案 4 :(得分:1)

单行总是很好。

$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 :(得分:0)

检查它是否小于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);

答案 6 :(得分:0)

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
)

答案 7 :(得分:0)

或者,您可以将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

答案 8 :(得分:-2)

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];
        }
    }
}

此功能可以帮助您

答案 9 :(得分:-4)

array_filter是解决问题的功能......