【问题标题】:Remove empty string in array of strings删除字符串数组中的空字符串
【发布时间】:2020-12-15 15:56:26
【问题描述】:

似乎有几十个主题有类似的问题,而且大多数都有相同的答案:使用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: ; ;

【问题讨论】:

  • 它看起来像 [6][1] 中的元素,其中有一些空格。
  • 你们是对的人。有空行。我将使用 csv 数据更新帖子,以便您了解它是如何工作的。

标签: php arrays csv


【解决方案1】:

而且大多数人都有相同的答案:使用 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
    )
);

【讨论】:

  • 嗯,这对我来说是新的。效果很好!不仅感谢您的解决方案,还感谢您的解释。很有帮助!
  • 问一个简单的问题:PHP 7.4 语法中第二个 0 代表什么?
  • 哦,对不起。第一个忘记了。这是$carry 的默认参数。看看这里:php.net/manual/en/function.array-reduce.php
猜你喜欢
  • 2022-11-16
  • 2019-05-21
  • 1970-01-01
  • 2018-04-12
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多