1

我目前正在尝试处理一个以 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    
    }
} 

任何能引导我朝着正确方向实现我需要的建议或意见将不胜感激!

谢谢

4

1 回答 1

3

如果这不是您要找的,请澄清您的问题。

如果你想要一个包含该 Json 数据的数组,你可以这样做

$decodedJsonData = array_map(
    function($jsonString) {
        return json_decode($jsonString, true);
    },
    file('/path/to/logfile')
);

这会将整个文件逐行读入一个数组并应用于json_decode每个行/元素,从而生成该 Json 数据的数组数组。

对于您上面的 Json,结果将是 ( demo )

Array
(
    [0] => Array
        (
            [timestamp] => 2012-09-16 14:10:36
            [event] => log_start
            [unixTime] => 1347768636
        )

    [1] => Array
        (
            [timestamp] => 2012-09-16 14:10:36
            [event] => player_status
            [player] => Array
                (
                    [name] => PLAYER NICKNAME
                    [userId] => 15
                    [uniqueId] => STEAM_X:X:XXXXXXX (STEAMID)
                    [team] => 1
                )

            [address] => xxx.xxx.xxx.xxx (IP)
            [country] => AU
        )
    [2] => Array
        (
            [timestamp] => 2012-09-16 14:10:36
            [event] => live_on_3
            [map] => de_mirage_csgo
            [teams] => Array
                (
                    [0] => Array
                        (
                            [name] => Terrorists
                            [team] => 2
                        )

                    [1] => Array
                        (
                            [name] => Counter-Terrorists
                            [team] => 3
                        )

                )
            [status] => 5
            [version] => 1.0.0 Beta
        )
)

更多的信息:

于 2012-10-04T11:25:55.793 回答