删除空数组元素

1034

我的数组中有一些来自用户的空字符串元素。在执行以下操作后,$linksArray 仍然具有空元素:

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

empty() 函数也不起作用。


4
值得一提的是,上面的代码无法运行,因为unset(...)操作的是由foreach循环创建的变量,而不是明显保持不变的原始数组。 - savedario
1
如果(!empty($link)) { echo $link; } 这对我有效 - Shiplu
2
您正在更改一个未被引用的 $link!请使用 foreach($linksArray as $key => $link) unset(linksArray[$key])。 - Nijboer IT
https://dev59.com/lm855IYBdhLWcg3wSiU7#66004034 - Billu
27个回答

14

最高票答案是错误的,或者至少不完全正确,因为 OP 只讨论空字符串。以下是一个详细的解释:

empty 是什么意思?

首先,我们必须就 empty 的含义达成一致。你是指要过滤掉:

  1. 只有空字符串(“”)吗?
  2. 严格为 false 的值?($element === false
  3. falsey 值?(即 0、0.0、“”、“0”、NULL、array() 等)
  4. PHP 中 empty() 函数的等价物吗?

如何过滤这些值

要过滤只有空字符串

$filtered = array_diff($originalArray, array(""));

要仅过滤出严格为false的值,您必须使用回调函数:

$filtered = array_diff($originalArray, 'myCallback');
function myCallback($var) {
    return $var === false;
}

回调函数在任何你想过滤掉“假值”但又有例外情况的组合中也很有用。例如,过滤每个 nullfalse 等,仅留下 0

$filtered = array_filter($originalArray, 'myCallback');
function myCallback($var) {
    return ($var === 0 || $var === '0');
}

第三种和第四种情况(对于我们的目的而言)是等价的,因此您只需要使用默认设置:

$filtered = array_filter($originalArray);

2
如果你想去掉 nullfalse,但是保留0,你也可以使用PHP内置的 strlen 函数作为回调。 - Cullub

11
$a = array(1, '', '', '', 2, '', 3, 4);
$b = array_values(array_filter($a));

print_r($b)

array_values函数可以使索引变得连续。谢谢 :) - Pankaj Wanjari

11

对于多维数组

$data = array_map('array_filter', $data);
$data = array_filter($data);

10

为了保持一个数组值为字符串 "0",我不得不这样做。

$url = array_filter($data, function ($value) {
  return (!empty($value) || $value === 0 || $value==='0');
});

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

9
function trim_array($Array)
{
    foreach ($Array as $value) {
        if(trim($value) === '') {
            $index = array_search($value, $Array);
            unset($Array[$index]);
        }
    }
    return $Array;
}

https://dev59.com/lm855IYBdhLWcg3wSiU7#66004034 - Billu
为什么不在foreach()的签名中更简单地声明$index呢?这个未经解释的答案不是高效/优化/直接的。 - mickmackusa

8

我想提供一种代替循环的方法...还可以解决键中的间隙...

在我的情况下,当操作完成时,我想保留顺序数组键(不仅仅是奇数,这就是我所看到的。为了只寻找奇数键而设置代码似乎对我来说很脆弱,也不够具有未来性)。

我正在寻找更像这样的东西:http://gotofritz.net/blog/howto/removing-empty-array-elements-php/

array_filter 和 array_slice 的组合成功地解决了问题。

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

虽然没有关于效率或基准的想法,但它能够正常工作。


1
我认为array_values和array_slice会产生相同的结果。从后续阅读代码和理解其功能方面来看,这似乎更直观。 - arlomedia

7
我使用以下脚本从数组中删除空元素。
for ($i=0; $i<$count($Array); $i++)
  {
    if (empty($Array[$i])) unset($Array[$i]);
  }

6
$my = ("0"=>" ","1"=>"5","2"=>"6","3"=>" ");   

foreach ($my as $key => $value) {
    if (is_null($value)) unset($my[$key]);
}

foreach ($my as $key => $value) {
    echo   $key . ':' . $value . '<br>';
} 

output

1:5

2:6


5
foreach($arr as $key => $val){
   if (empty($val)) unset($arr[$key];
}

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