如何从数组中删除空值?

45

我有一个数组

Array ( [0] => 0 [1] => [2] => 3 [3] => )

我想要从中删除null值,结果应该像这样

Array ( [0] => 0 [1] => 3) 我不想从数组中删除0值。


使用自定义回调函数的http://www.php.net/array_filter。 - Cthulhu
在php.net上查找array_filter。 - Nick Maroulis
简单解决方案:https://dev59.com/lm855IYBdhLWcg3wSiU7#66004034 - Billu
6个回答

83

这样做就能解决问题:

array_filter($arr, static function($var){return $var !== null;} );

代码示例:https://3v4l.org/jtQa2


针对旧版本(php<5.3):

function is_not_null ($var) { return !is_null($var); }
$filtered = array_filter($arr, 'is_not_null');

代码示例:http://3v4l.org/CKrYO


3
只适用于更新版本,但这比奇怪的 strlen 东西要好得多。 - Edgar Klerks
2
对于旧版本,可以预先声明所使用的函数。 - Cthulhu
2
你可以完全省略第二个参数;array_filter($arr);默认会删除null - AlexP
2
@AlexP 不对,你错了。如 https://3v4l.org/Y9KCX 所示,你的解决方案会删除所有 empty() 的内容 - 不仅仅是 NULL。 - floww
2
@AlexP:如果您忽略过滤函数,例如字符串“0”将被删除。 - mercredo
显示剩余2条评论

29
你可以使用array_filter()函数来从数组中删除空值。
print_r(array_filter($arr, 'strlen'));

1
这不起作用。 $ php -r “var_dump(array_filter([0,null,false,'hi','' ],'strlen')); ” 数组(2){ [0]=> int(0) [3]=> string(2) "hi" } - Rob
2
这也会删除“0”,false或其他假值。可能忘记了其他的。 - Gokigooooks
1
这将包括“”而不是空值。 - Nizar Blond
你甚至可以使用 $arr = array_filter($arr); 而不需要回调函数,它仍然会删除空项。 - OMA
从PHP8.1开始,这不再是一种好的技术,因为它会生成弃用警告。Deprecated: strlen(): Passing null to parameter #1 ($string) of type string is deprecated - mickmackusa

6
你可以直接对其进行循环。
<?php 
foreach ($array as $i=>$row) {
    if ($row === null)
       unset($array[$i]);
}

CodePad

如果您想重新索引数组以删除键之间的间隙,您可以使用一个新数组:

<?php
$array2 = array();
foreach ($array as $row) {
    if ($row !== null)
       $array2[] = $row;
}
$array = $array2;

CodePad


4

现在你可能陷入了麻烦之中,因为要区分 null、0、false、"" 和 0.0 并不是很容易。但别担心,这个问题是可以解决的:

 $result = array_filter( $array, 'strlen' );

这本身就很糟糕,但似乎是有效的。

编辑:

这是错误的建议,因为这个技巧依赖于一个奇怪的边缘情况:

  • strlen(0) 将变成 strlen("0") -> 1,因此为 true
  • strlen(NULL) 将变成 strlen("") -> 0,因此为 false
  • strlen("") 将变成 strlen(("")->0,因此为 false 等等。

你应该这样做:

 $my_array = array(2, "a", null, 2.5, NULL, 0, "", 8);

 function is_notnull($v) {
    return !is_null($v);
  }

 print_r(array_filter($my_array, "is_notnull"));

这很容易阅读。

2
从PHP8.1开始,strlen不再是一种好的技术,因为它会生成过时警告。Deprecated: strlen(): Passing null to parameter #1 ($string) of type string is deprecated - mickmackusa

2
<?php 
$arr = array( 0 => 0, 1=>null, 2=>3, 3=>null); 
foreach ($arr as $key=>$val) {
    if ($val === null)
       unset($arr[$key]);
}
$new_arr = array_values($arr);
print_r($new_arr);
?>

输出:

Array
(
    [0] => 0
    [1] => 3
)

0

简单地

$keys=array_keys($yourArray,NULL);
if(!empty($keys))
{
foreach($keys as $key)
{
unset($yourArray[$key]);
}
}
var_dump($yourarray);

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