首页 > 解决方案 > 删除字符串数组中的空字符串

问题描述

似乎有几十个主题有类似的问题,而且大多数都有相同的答案:使用array_filterarray_map。问题是我使用了它们,但并没有太大帮助。所以我有一个数组(由 csv 文件中的数据构建):

Array
(
[0] => Array
    (
        [0] => name
        [1] => title
        [2] => email
    )

[1] => Array
    (
        [0] => First
        [1] => title 1
        [2] => email1@ex.com
    )

[2] => Array
    (
        [0] => second
        [1] => title 1
        [2] => email2@ex.com
    )

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

[4] => Array
    (
        [0] => third
        [1] => title 1
        [2] => email3@ex.com
    )

[5] => Array
    (
        [0] => 
    )

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

我必须删除所有空数组。所以我使用这样的代码:

    while (($row = fgetcsv($file, 8192, ';')) !== false) {
        if (array(null) !== $row) { // ignore blank lines
            $csv[] = $row;
        }
    }
    $array = array_filter(array_map('array_filter', $csv));

$array 现在是:

 Array
(
[0] => Array
    (
        [0] => name
        [1] => title
        [2] => email
    )

[1] => Array
    (
        [0] => First
        [1] => title 1
        [2] => email1@ex.com
    )

[2] => Array
    (
        [0] => second
        [1] => title 1
        [2] => email2@ex.com
    )

[3] => Array
    (
        [0] => third
        [1] => title 1
        [2] => email3@ex.com
    )

[4] => Array
    (
        [1] =>  
    )
) 

为什么有一个空值的第四个数组?我需要摆脱它。 gettype($array[4][1]) = 字符串

更新

csv 有空行,甚至只有一个“;” 没有任何字符串的分隔符。我无法影响将数据插入此 csv 的过程。csv 看起来像这样:

 1 row: name;title;email
 2 row: First;title 1;email1@ex.com
 3 row: second;title 1;email2@ex.com
 4 row:
 5 row: third;title 1;email3@ex.com
 6 row:
 7 row: ; ;

标签: phparrayscsv

解决方案


并且大多数人都有相同的答案:使用array_filter,array_map。

array_filter 是一个好方法,但我不会使用array_map,而是使用array_reduce:

$array = array_filter(
    $csv,
    function ($value) {
        return 0 < array_reduce(
            $value,
            function ($carry, $item) {
                return empty(trim($item)) ? $carry : $carry + 1;
            },
            0
        );
    }
);

使用array_reduce,我计算数组中的非空元素。如果有零个非空元素,则使用 array_filter 丢弃该数组。

作为参考,PHP 7.4 语法在我看来更好看,但一开始可能有点混乱

$array = array_filter(
    $csv,
    fn ($val) => 0 < array_reduce(
        $val, 
        fn ($carry, $item) => empty(trim($item)) ? $carry : $carry + 1, 
        0
    )
);

推荐阅读