起因,我想利用一个记录了mac地址列表的文本文件,产生类似与map的格式。mac.txt 内容如下(为了方便叙述,只保留了5行):
98EECB8C6766
98EECB89E357
98EECB8C7879
98EECB8C6A10
98EECB8C6828
处理脚本 format.php 如下:
php
<?php
$content = file_get_contents('mac.txt');
$lines = explode("\n", $content);
var_dump($lines);
for ($i = 0; $i < count($lines); $i++) {
echo '"'.$lines[$i].'":'.($i+1).",\n";
}
结果,输出的内容有点怪异:
bash
array(5) {
[0]=>
" string(13) "98EECB8C6766
[1]=>
" string(13) "98EECB89E357
[2]=>
" string(13) "98EECB8C7879
[3]=>
" string(13) "98EECB8C6A10
[4]=>
string(12) "98EECB8C6828"
}
":1,ECB8C6766
":2,ECB89E357
":3,ECB8C7879
":4,ECB8C6A10
"98EECB8C6828":5,
当时心急,调试了半天不知道问题在哪里。怪也怪我看看内容简单,当时心又急,就想粗暴使用 file_get_contents 和 explode 解决问题,没有耐心分析原因,只知道瞎改输出格式,就没有找到问题。
问题就出在你没法知道 mac.txt 的行结束符使用的是 \n 还是 \r\n。正好 mac.txt 是 Windows 下拷贝终端输出到记事本生成的,而上述代码用 \n 来分割内容,从而数组每个元素是字符串 xxxx\r,在输出时,因为\r,后续的输出内容会覆盖前面的输出内容。
知道了原因自然好办了,给 echo 语句加 trim 就行:
php
echo '"'.trim($lines[$i]).'":'.($i+1).",\n";