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

Kan*_*iya 31 php arrays array-filter

我想删除NULL,FALSE''值.

我用过,array_filter但它也删除了0.

是否有anty功能来做我想要的?

array(NULL,FALSE,'',0,1) -> array(0,1)
Run Code Online (Sandbox Code Playgroud)

Max*_*ens 46

array_filter如果使用identical比较运算符,应该可以正常工作.

这是一个例子

$values = [NULL, FALSE, '', 0, 1];

function myFilter($var){
  return ($var !== NULL && $var !== FALSE && $var !== '');
}

$res = array_filter($values, 'myFilter');
Run Code Online (Sandbox Code Playgroud)

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

$res = array_filter($values, function($value) {
    return ($value !== null && $value !== false && $value !== ''); 
});
Run Code Online (Sandbox Code Playgroud)

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

$res = array_filter($values, 'is_numeric');
Run Code Online (Sandbox Code Playgroud)


Vla*_*nko 38

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

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

array_filter($array, 'strlen');
Run Code Online (Sandbox Code Playgroud)

  • 天才!请注意,对象和数组也将被删除,并且 strlen 会发出有关它们的警告。 (4认同)
  • 这确实有效,因为strlen()将其参数转换为string-所以0和1变为"0"和"1",而null和false变为"". (2认同)

Age*_*rum 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));
}
Run Code Online (Sandbox Code Playgroud)

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

$array = array_filter($array, "RemoveFalseButNotZero");
Run Code Online (Sandbox Code Playgroud)