PHP中键值'0012'对应两个数组索引,疑编码问题求助
问题根源:UTF-8 BOM 导致的隐形字符冲突
嘿,这问题我碰过好多次了!你看输出里第一个0012键前面藏着个看不见的东西不?就是[0012]里0前面的隐形字符——那是UTF-8 字节顺序标记(BOM),正是它搞的鬼!
为什么会出现两个0012数组?
你的考勤文本文件应该是用带BOM的UTF-8编码保存的。BOM是文件开头的三个隐藏字节(EF BB BF),当你用file_get_contents读取文件时,这三个字节会被当成第一行内容的前缀,导致第一个empId实际上是[BOM]0012——看起来和正常的0012一模一样,但本质是两个完全不同的字符串,PHP自然会把它们当成两个独立的数组键。
解决方案:去除文件BOM并优化脚本
修改你的PHP脚本,读取文件时先去掉BOM,同时优化空行处理逻辑,避免出现空键:
$filename = 'file.txt'; // 读取文件并去除UTF-8 BOM $content = file_get_contents($filename); $content = preg_replace('/^\x{FEFF}/u', '', $content); $array = explode("\n", $content); // 先清理每行前后空白,再过滤空行 $array = array_filter(array_map('trim', $array)); $empArr = array(); foreach($array as $line){ // 限制分割次数,避免特殊情况下时间字段被拆分 list($empId, $date, $time) = explode(" ", $line, 3); $empId = trim($empId); $empArr[$empId][] = $date . ' ' . $time; } echo "<pre>"; print_r($empArr); echo "</pre>";
额外说明
你输出里的空键[],是因为原脚本的array_filter只过滤了完全为空的行,但如果行里只有空白字符(比如换行后的空格),就会残留无效数据。加上array_map('trim', $array)就能彻底清理这类无效行。
运行修改后的脚本,所有0012的考勤记录就会合并到同一个数组键下啦!
内容的提问来源于stack exchange,提问作者Murad Hasan
相关产品推荐
相关产品推荐

