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オブジェクトを効果的に定義しますか?私はこれらすべてのオブジェクトを1行ずつデコード(連想配列として保存)(json_decode($string,TRUE)しようとしています。そこから、ループを介して1つの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 に答える