You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 17:32:38