PHP如何在数组中删除“空”值

6

我想使用以下函数清除数组中的空值:

function remove_empty_cells($data)
{
    $findthis = array("/\r\n/u", "/\n/u", "/\r/u", "/\s+/u", "~\x{00a0}~");
    for($i=0; $i<count($data); $i++)
    {
        $data[$i] = preg_replace($findthis, " ", $data[$i]);
        $data[$i] = htmlspecialchars_decode(htmlspecialchars($data[$i], ENT_SUBSTITUTE, 'UTF-8'));
        if (empty($data[$i]) ||
            mb_strlen($data[$i]) < strlen($data[$i]) ||
            is_null($data[$i]) ||
            $data[$i] = " " ||
            $data[$i] = "" ||
            $data[$i] == "0")
        {
             array_splice($data, $i, 1);
        };//end if
    };//end for
    return $data;
};//end func

空值并未消失,我无法识别它们...
数据如下:
array (
  0 => '
',
  1 => 'BEGIN:VCARD 
',
  2 => '
',
  3 => '
',
  4 => '
',
  5 => '
',
  6 => '
',
  7 => 'VERSION:2.1 
',

可能存在一些编码问题或其他问题...它看起来不像是多字节字符... 我得到的结果是:

array (
  0 => 'BEGIN:VCARD 
',
  1 => '
',
  2 => '
',
  3 => 'VERSION:2.1 
',

...


请发布您的数据 - Sugumar Venkatesan
@LeoTahk,请检查我下面提供的解决方案。 - Sachin PATIL
是的,修剪功能正常工作,感谢您指出。已标记为已回答。简单的array_filter没有效果。 - Leo Tahk
简单解决方案:https://dev59.com/lm855IYBdhLWcg3wSiU7#66004034 - Billu
为什么\x{00a0}也不能获得Unicode标志呢? - mickmackusa
4个回答

12

您可以使用PHP函数array_filter()来删除空值

<?php
$array = array("sampe1", "", "sample2", null, "sample4", "rajesh", "suresh", "test", "");
var_dump($array);
echo "<hr/>";
$result = array_filter($array);                 
var_dump($result);
?>

这将打印出:

array(9) { [0]=> string(6) "sampe1" [1]=> string(0) "" [2]=> string(7) "sample2" [3]=> NULL [4]=> string(7) "sample4" [5]=> string(6) "rajesh" [6]=> string(6) "suresh" [7]=> string(4) "test" [8]=> string(0) "" }

array(6) { [0]=> string(6) "sampe1" [2]=> string(7) "sample2" [4]=> string(7) "sample4" [5]=> string(6) "rajesh" [6]=> string(6) "suresh" [7]=> string(4) "test" 

10
您可以使用 PHP 函数 array_filter(),并带有以下回调函数来移除空值:
<?php
    $array = array("sampe1", "\n  ", "   ", "sample2", null, "sample4", "rajesh", "suresh", "test", "");

    $result = array_filter($array, function($v){
       return trim($v);
    });

    var_dump($result);

    $res = array_slice($result);

    var_dump($res);
?>

这将会打印出:
array(6) { [0]=> string(6) "sampe1" [3]=> string(7) "sample2" [5]=> string(7) "sample4" [6]=> string(6) "rajesh" [7]=> string(6) "suresh" [8]=> string(4) "test" }

array(6) { [0]=> string(6) "sampe1" [1]=> string(7) "sample2" [2]=> string(7) "sample4" [3]=> string(6) "rajesh" [4]=> string(6) "suresh" [5]=> string(4) "test" }

语法 - array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )

此函数用于过滤数组中的元素,返回一个新的数组。函数的第一个参数是要过滤的数组,第二个参数是可选的回调函数,可以自定义过滤规则。第三个参数也是可选的,用于设置过滤模式。请注意保留所有的HTML标签。

2

我不太确定你在你的代码中做了什么,但这里有一些可以从php数组中删除空元素的方法。

代码片段

<?php
   $array = array("apple", "", 2, null, -5, "orange", 10, false, "");
   var_dump($array);
   echo "<br>";

   // Filtering the array
   $result = array_filter($array);                 
   var_dump($result);
?>

2
我想这不会删除像 "\n\n""\r\n" 这样的值。 - u_mulder

2
使用array_filter函数,并不用回调函数,可以快速地从数组中移除空元素,但同时也会移除0(零)。如果只想移除空字符串而保留0,可以使用array_diff函数。
两个函数都会让数组出现“空洞”,即在原来的空位置上留下了索引。可以使用array_slice函数来移除这些“空洞”。
在您的示例中,初始数组为$arr,可以使用上述方法得到最终输出结果。初始输出和最终输出分别如下所示:
初始输出: Array ( [0] => [1] => BEGIN:VCARD [2] => [3] => [4] => [5] => [6] => [7] => VERSION:2.1 )
最终输出: Array ( [0] => BEGIN:VCARD [1] => VERSION:2.1 )

我刚刚使用了 $fileContents = array_filter( $fileContents ); print_r( array_slice( $fileContents, 0 ) ); 的代码,结果是:Array ( [0] => [1] => BEGIN:VCARD [2] => [3] => [4] => [5] => [6] => [7] => VERSION:2.1 .. not removed :/ - Leo Tahk
$arr = ['','BEGIN:VCARD','','','','','','VERSION:2.1']; NEXT: print_r($arr); $myArray = array_filter( $arr ); print_r( array_slice( $myArray, 0 ) );初始输出: Array ( [0] => [1] => BEGIN:VCARD [2] => [3] => [4] => [5] => [6] => [7] => VERSION:2.1 ) 最终输出:Array ( [0] => BEGIN:VCARD [1] => VERSION:2.1 ) - Sylvester
我的数据工作版本是:$array= array_filter($array, function($v){return trim($v);}); $array= array_slice($array, 0 , count($array)); - Leo Tahk
简单解决方案:https://dev59.com/lm855IYBdhLWcg3wSiU7#66004034 - Billu

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