php - 删除字符串数组中的空字符串
问题描述
似乎有几十个主题有类似的问题,而且大多数都有相同的答案:使用array_filter
,array_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: ; ;
解决方案
并且大多数人都有相同的答案:使用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
)
);
推荐阅读
- javascript - 我怎样才能让这个下拉列表显示所有五十个州而不是“选项#”
- docker - 如何从 docker 容器访问 docker cmd?
- c++ - 您如何将 std::unique_ptr 初始化为引用
- ubuntu - WSL:Cabal 无法解决依赖关系。容器,二进制
- python - API 调用在工作数百次后失败……有什么想法吗?
- spring-boot - 如何修复:java.lang.NoClassDefFoundError: org/springframework/core/env/EnvironmentCapable?
- php - 如何基于查询选择雄辩在laravel中使用用户授权
- python - Python 的 SpaCy EntityRuler 没有返回任何结果
- python - 为什么 split() 不分隔列表输出中字符串中的每个字符?
- html - 我可以让 flexbox 元素 flex-wrap 2 x 2 而不是 1 x 1 吗?