在PHP中使用fgetcsv时保留前导零

3
我正在读取一个 .csv 文件(文件格式我无法控制),并尝试在结果数组中保留数据的前导零。例如,.csv 文件包含“0615”字段,但结果数组包含“615”。.csv 文件中还有一些不包含前导零的字段,因此在每个字段前添加零将行不通。
我尝试强制函数将字段读取为字符串,但是 explode、str_getcsv 和 fgetcsv 都将其解析为整数并在此之前删除前导零。有什么想法吗?
编辑:explode 不会删除前导零。使用 fgets 的 explode 可行。

我完全没有这种行为,str_getcsv("001,002") 对我来说保留了前导零。你使用的是哪个PHP版本? - netcoder
3个回答

1

explode() 基于字符串操作; 您的类型转换可能发生在其他地方:

$data = "00555,00666,00777,00888";
$a = explode(",",$data);
foreach($a as $b) echo $b . " ";         // 00555 00666 00777 00888

如果PHP坚持将字符串解释为整数,请使用(string)$b


您是正确的。.csv文件存在问题,我假设explode函数已经删除了前导零。谢谢! - user978887
1
使用 explode 时要小心,它不知道带引号的逗号。如果你的值可能是像 "XYZ, Inc." 这样的东西,这会出问题。 - Eli

0
使用 str_pad 函数将前导零添加到解析的整数中,以便在需要时使用。
或者使用sprintf,如果你对它很熟悉的话。
$num = 1;
$num = sprintf('%04d', $num);
//               ^^
//               ||_ How many leading digits?
//               |_ Leading digit?
// output: 0001

问题在于没有办法确定何时需要前导数字,除非查看原始的 .csv 数据,但一旦字段被解析,就无法进行。 - user978887
@user978887 在执行 explode 之前,你不能先使用 preg_replace 将 0 替换为一个特殊字符,然后再将其替换回 0 吗? - Shef
1
最终问题出在 .csv 文件上,不过在我意识到问题之前,这个解决方案对我测试的某些数据是有效的。谢谢。 - user978887

0

这些数字实际上被发送到数据库中,其中该字段表示唯一值。我需要0615与615和00615不同。 - user978887

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