43

我想删除NULL,FALSE''values 。

我用过array_filter,但它也删除了0's。

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

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

9 回答 9

64

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

这是一个例子

$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作为回调:示例

$res = array_filter($values, 'is_numeric');
于 2013-01-03T06:28:08.747 回答
53

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

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

array_filter($array, 'strlen');
于 2014-12-16T09:26:47.290 回答
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");
于 2013-01-03T06:37:51.860 回答
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"));
?> 
于 2013-01-03T06:26:55.443 回答
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

编辑:

事实证明,您不需要在第二个数组中拥有NULLand 。FALSE相反,您可以只拥有'',它的工作方式相同:

$clean_array = array_diff(array_map('trim', $my_array), array(''));
于 2013-06-18T03:57:45.010 回答
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);
于 2013-01-03T06:26:51.403 回答
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
)
于 2013-01-03T06:28:36.557 回答
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

于 2020-01-14T16:31:53.217 回答
-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];
        }
    }
}

这个功能可以帮助你

于 2013-01-03T06:36:10.827 回答