PHP读取.txt文件并创建一个数组

时间:2020-07-05 12:12:29

标签: php

我需要读取.txt文件并创建用于获取值的数组。

我主要想用php来做,但是我接受其他建议

[Slot000]可以和服务器内部的人数一样多(001、002、003 ... 010,011 ...)

.txt文件每5秒更新一次。

感谢我的帮助!

代码示例:

[Server]
ServerPLR=DedicatedServer
LobbyName=xFactorracing.com V8 OR
ModName=V8Factor Unleashed 2012 v1.1
Aids=0,0,1,1,0,0,0,0,1,1,3

[Session]
Scene=Queensland International Raceway
TrackAIW=Queensland.AIW
TrackLength=3134.0745
StartTime=2013-08-09 05:26:27
LengthLaps=-1
LengthTime=90
DarkCloud=0.00
Raining=0.00
AmbientTemp=24.8
TrackTemp=24.3
OnPathWetness=0.00
OffPathWetness=0.00
SessionTime=1.005314
Session=Practice1
GamePhase=Preparing
YellowFlag=None
SectorYellowFlags=(0,0,0)
FCY_log=()

[Slot000]
Driver=daniel
Vehicle=Unknown
VehicleClass=Unknown
IsAI=1
Position=1
Laps=0
InSector=1
BestLap=-1.000
LastLap=-1.000
BestSectors=(-1.000, -1.000, -1.000)
LastLapSectors=(-1.000, -1.000, -1.000)
Sectors=(-1.000, -1.000, -1.000)
Pitstops=0
InPits=1
TimeGapToLider=0.000
LapGapToLider=0
TimeGapToPrev=0.000
LapGapToPrev=0
LapDistanceTravelled=-1.069
FinishStatus=None

[END]

1 个答案:

答案 0 :(得分:0)

您的文本文件遵循php.ini格式/结构,因此您可以方便地使用parse_ini_函数(see manual),而不用编写自定义解析器。尽管行FCY_log=()引发错误,但是()(空括号)是不可接受的语法,因此我们在解析字符串之前要进行一些预处理。仍然很简单:

$raw = file_get_contents('file.txt');
$raw = str_replace('=()', '=', $raw); // fixing the offending value
$data = parse_ini_string($raw, true, INI_SCANNER_TYPED);
var_dump($data);

如果没有语法异常,则可以简单地使用parse_ini_file('file.txt')来代替。无论如何,这都会产生一个关联数组,如下所示:

array(4) {
    ["Server"] · array(4) {
        ["ServerPLR"] · string(15) "DedicatedServer"
        ["LobbyName"] · string(23) "xFactorracing.com V8 OR"
        ["ModName"] · string(28) "V8Factor Unleashed 2012 v1.1"
        ["Aids"] · string(21) "0,0,1,1,0,0,0,0,1,1,3"
    }
    ["Session"] · array(18) {
        ["Scene"] · string(32) "Queensland International Raceway"
        ["TrackAIW"] · string(14) "Queensland.AIW"
        ["TrackLength"] · float(3134.0745)
        ["StartTime"] · string(19) "2013-08-09 05:26:27"
        ["LengthLaps"] · int(-1)
        ["LengthTime"] · int(90)
    ...
    

由于可以有多个插槽,大概具有相同名称的键,因此我们使用process_sections选项parse_ini_string($raw, **true**),它产生按节标题分组的多维数组。我们还使用了INI_SCANNER_TYPED标志;没有它,所有值都将是“字符串”类型。 (在您的用例中可能无关紧要。)