我的数组中的一些元素是基于用户提交的空字符串。我需要移除这些元素。我有这个:

foreach($linksArray as $link)
{
    if($link == '')
    {
        unset($link);
    }
}
print_r($linksArray);

但这并不奏效。$linksArray仍然有空元素。我也尝试过用empty()函数这样做,但结果是一样的。


当前回答

关于这个话题,最流行的答案是绝对不正确。

考虑下面的PHP脚本:

<?php
$arr = array('1', '', '2', '3', '0');
// Incorrect:
print_r(array_filter($arr));
// Correct:
print_r(array_filter($arr, 'strlen'));

为什么会这样?因为包含单个'0'字符的字符串的计算值也是布尔值false,所以即使它不是空字符串,它仍然会被过滤。那将是一个漏洞。

将内置的strlen函数作为过滤函数传递可以工作,因为它对于非空字符串返回一个非零整数,对于空字符串返回一个零整数。非零整型在转换为布尔型时总是求值为真,而零整型在转换为布尔型时总是求值为假。

所以,绝对的、确定的、正确的答案是:

$arr = array_filter($arr, 'strlen');

其他回答

$out_array = array_filter($input_array, function($item) 
{ 
    return !empty($item['key_of_array_to_check_whether_it_is_empty']); 
}
);

我认为array_walk更适合这里

$linksArray = array('name', '        ', '  342', '0', 0.0, null, '', false);

array_walk($linksArray, function(&$v, $k) use (&$linksArray){
    $v = trim($v);
    if ($v == '')
        unset($linksArray[$k]);
});
print_r($linksArray);

输出:

Array
(
    [0] => name
    [2] => 342
    [3] => 0
    [4] => 0
)

我们确保即使用户添加了多个空格,空值也会被删除 我们还修剪了有效值中的空格 最后,只有(null), (Boolean False)和(")将被视为空字符串

至于False,可以删除它,因为AFAIK用户不能提交布尔值。

    $myarray = array_filter($myarray, 'strlen');  //removes null values but leaves "0"
    $myarray = array_filter($myarray);            //removes all null values

只是想为循环提供一个替代方案…还解决了密钥的差距……

在我的例子中,我希望在操作完成时保留顺序数组键(而不仅仅是我所关注的奇数)。对我来说,将代码设置为只寻找奇数键似乎很脆弱,而且不适合将来使用。)

我一直在寻找类似这样的东西:http://gotofritz.net/blog/howto/removing-empty-array-elements-php/

array_filter和array_slice的组合可以达到目的。

$example = array_filter($example);
$example = array_slice($example,0);

不知道效率或基准,但它是有效的。

使用array_filter函数删除空值:

$linksArray = array_filter($linksArray);
print_r($linksArray);