【发布时间】:2012-09-25 10:10:29
【问题描述】:
我目前正在尝试处理以 JSON 格式存储游戏信息的相对较大的日志文件。任何日志文件的平均范围为 2000-5000 行。
来自日志文件的示例输出(保留格式...),注意:为了他自己的隐私,我已经删除了玩家姓名、SteamID 和 IP 地址:
{"timestamp": "2012-09-16 14:10:36", "event": "log_start", "unixTime": 1347768636}
{"timestamp": "2012-09-16 14:10:36", "event": "player_status", "player": {"name": "PLAYER NICKNAME", "userId": 15, "uniqueId": "STEAM_X:X:XXXXXXX (STEAMID)", "team": 1}, "address": "xxx.xxx.xxx.xxx (IP)", "country": "AU"}
{"timestamp": "2012-09-16 14:10:36", "event": "live_on_3", "map": "de_mirage_csgo", "teams": [{"name": "Terrorists", "team": 2}, {"name": "Counter-Terrorists", "team": 3}], "status": 5, "version": "1.0.0 Beta"}
这就是问题的开始。日志文件的每一行都有效地定义了一个新的 JSON 对象?我正在尝试逐行解码所有这些对象(将它们存储为关联数组)(json_decode($string,TRUE),然后我尝试通过循环将它们合并到一个 PHP 数组中。这确实“有效”(从某种意义上说没有视觉错误),但是 array_merge 不会产生任何接近我预期结果的东西。这是我的代码:
/* parse the logfile into array */
for ($i = 0; $i < $lineCount; $i++) {
if ($i === 0) { // first iteration
$arrLog = json_decode($line[$i],true);
} else {
$arrTempLog = json_decode($line[$i],true); // create temp array to store each line
$arrLog = array_merge($arrLog, $arrTempLog); // merge temp array w/ main array
}
}
任何能引导我朝着正确方向实现我需要的建议或意见将不胜感激!
谢谢
【问题讨论】:
-
嗯,你期望结果是什么?
-
我希望数组包含日志文件中的所有信息,但它只包含一行左右(最多)。
-
我喜欢使用 "$arrLog[] = ..." 但正如 Gordon 所说:这取决于您想要输出的内容。
-
也许最好让您访问整个日志文件的日志,这样您就可以看到我得到的结果?
-
我复制了你提交的json字符串,我在开头添加了一个
[,在每个换行符处添加了一个逗号,在末尾添加了一个],有效地使其适合对象数组- 使用 json_decode 和 true 作为第二个参数,我得到一个对象数组。
标签: php json parsing loops associative-array