PHP代码处理CSV后var_dump输出缺失_60,请求排查原因
问题分析:为什么_60没有出现在输出中?
你的代码存在两个关键问题导致了这个结果,咱们一步步拆解:
1. 换行符引发的匹配失败
fgets()读取文件时会把每行末尾的**换行符(\n)**也一并读取进来。你的1.csv内容是4_10,5_20,6_60,假设文件末尾带有换行,那么fgets()拿到的实际字符串是"4_10,5_20,6_60\n"。
当你用explode(",", $line)拆分后,最后一个元素变成了"6_60\n"而非"6_60"。接着用explode("_", $providerInfo)拆分这个元素,得到的第二部分是"60\n",拼接后source变成"_60\n"——这个值和你$allowedSources里的"_60"完全不匹配,自然不会被加入$sourceList。
2. 循环逻辑冗余(虽不直接导致问题,但影响执行逻辑)
你把foreach ($lines as $line)放在了while循环内部,每次读取一行就立刻遍历整个$lines数组处理所有行。比如如果文件有3行,第一行会被重复处理3次,第二行2次,第三行1次——这完全是多余的。在这个场景里因为只有一行,所以只影响效率,但结合换行符的问题,就直接导致了_60被排除在外。
修复方案
把这两个问题一并解决:
<?php $lines = array(); $handle = @fopen("./1.csv", "r"); if ($handle) { while (($buffer = fgets($handle, 4096)) !== false) { // 去除换行符和首尾空白字符,保证字符串干净 $cleanLine = trim($buffer); $lines[] = $cleanLine; } // 所有行读取完成后统一处理,避免重复执行 foreach ($lines as $line) { getNo($line); } fclose($handle); } function getNo($line) { $allowedSources = array( '_10' => 1, '_20' => 1, '_60' => 1 ); $providerList = explode(",", $line); $sourceList = array(); foreach ($providerList as $providerInfo) { $providerAndSource = explode("_", $providerInfo); // 增加判断,避免拆分失败引发报错 if (isset($providerAndSource[1])) { $source = "_" . $providerAndSource[1]; if (array_key_exists($source, $allowedSources)) { $sourceList[] = $source; } } } var_dump($sourceList); } ?>
修复后的代码:
- 用
trim()清理每行的换行符和空白,确保拆分后的字符串符合预期 - 把行处理逻辑移到
while循环外,所有行读取完成后统一执行,避免冗余操作 - 增加格式校验,防止异常行导致代码报错
现在执行代码,输出就会变成:
array(3) { [0]=> string(3) "_10" [1]=> string(3) "_20" [2]=> string(3) "_60" }
内容的提问来源于stack exchange,提问作者harp1814
相关产品推荐
相关产品推荐

