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

51

我想移除 NULLFALSE'' 值。

我使用了 array_filter,但它也会移除 0 的值。

有没有其他函数可以满足我的需求?

array(NULL,FALSE,'',0,1) -> array(0,1)
9个回答

67

array_filter如果使用全等比较运算符,应该可以正常工作。

这是一个例子

$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"" 更多的内容。 - AgentConundrum
true,已经在答案中添加了一条注释。 - gherkins

65

3
这实际上是有效的,因为strlen()会将其参数转换为字符串- 所以0和1变成了"0"和"1",而null和false变成了""。 - andig
5
太棒了!只需注意对象和数组也将被删除,而strlen会对它们产生警告。 - oriadam
1
从PHP 8.1开始,strlen函数现在会发出一个弃用错误:"strlen(): Passing null to parameter #1 ($string) of type string is deprecated"。 - Brad Kent

5
array_filter不起作用,因为默认情况下它会删除任何等同于FALSE的内容,而PHP认为0等同于false。关于此问题,PHP手册有以下说明:

在转换为布尔值时,以下值被视为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");

或者如果您喜欢使用lambda表达式:$array= array_filter($array, function($val) { return ($val || is_numeric($val));}); - user1914530
1
@bmewburn,您需要删除否定。如果您想保留该值,则回调返回TRUE。当我最初编写答案时,我记错了。 - AgentConundrum

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

我不确定为什么这个被踩了 :( 好吧,也许回调函数可以写得不同,也许它可以使用帖子中的数据,但它可能展示了一个OP没有考虑过的用法。(我自己的投票已用完..) - user166390
它没有显示确切的回调,因为我不想喂食。答案本身表明,“示例中的回调函数是基于奇偶过滤的;您可以编写一个小函数来根据您的要求进行过滤。”并且我从PHP手册中提取了它。 - Amit

1

一行代码总是很好的。

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

解释:

  • array_diff的第一个参数:使用array_map函数,对$my_array中的每个元素进行去除前后空格的操作(通过trim函数)。使用去除空格后的版本是比较好的做法,以防某个元素包含仅由空格(如制表符、空格)组成的字符串,这些字符串也应该被移除。如果您不想去除元素的空格,则可以直接使用$my_array作为第一个参数。
  • array_diff的第二个参数:一个要从$my_array中删除的项目数组。
  • 输出结果:一个包含在第一个数组中但不包含在第二个数组中的元素数组。在本例中,因为''、NULLFALSE都在第二个数组中,所以它们永远不会被array_diff返回。

编辑:

事实证明,在第二个数组中,您不需要使用 NULLFALSE。相反,您可以只使用 '',它将以相同的方式工作:
$clean_array = array_diff(array_map('trim', $my_array), array(''));

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

如果它是 array(NULL,FALSE,'hello world') 呢? - user166390
它会包含字符/字符串吗? - Vinoth Babu

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
)

0

1
如果您的数组包含其他数组,则会引发错误。 - Brilliand
1
从PHP 8.1开始,strlen将会发出一个“已弃用”的错误警告,内容为“strlen():向类型为string的参数#1($string)传递null是不被允许的”。 - Brad Kent

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

这个函数可能会对你有所帮助


这很丑,而且它将会有同 OP 遇到的问题。你必须使用 恒等比较运算符。好的解决方案最多只有 3 行代码,甚至不用定义函数。 - David Ferenczy Rogožan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接