php对json数据迭代,php – 如何正确迭代一个大的json文件

这篇博客介绍了如何使用流式解析器处理大型JSON文件,以避免一次性加载整个文件到内存中。示例中展示了如何使用JsonStreamingParser和JsonReader这两个PHP库来逐行读取文件并提取特定数据,例如 summonerId, championId 和 totalSessionsPlayed。这种方法对于处理大数据量的JSON文件非常有效。
摘要由CSDN通过智能技术生成

您将需要使用流式解析器.这些只能一次将文件的一小部分拉入内存.

推分析器

当它浏览文件时,我们将跟踪summonerId,championId和state.它都是基于事件的 – 您不会通过顺序解析器获得随机访问权限,因此您必须自己跟踪事物.每当totalSessionsPlayed出现时,它都会回显summonerId,championId和totalSessionsPlayed.

data.json

这是一个用于演示目的的配对json文件.

[

{

"_id": "53b29644aafd413977b23b7e",

"summonerId": 24570940,

"region": "euw",

"stats": {

"110": {

"totalSessionsPlayed": 3,

"totalSessionsLost": 2,

"totalSessionsWon": 1

},

"112": {

"totalSessionsPlayed": 45,

"totalSessionsLost": 2,

"totalSessionsWon": 1

}

}

},

{

"_id": "asdfasdfasdf",

"summonerId": 555555,

"region": "euw",

"stats": {

"42": {

"totalSessionsPlayed": 65,

"totalSessionsLost": 2,

"totalSessionsWon": 1

},

"88": {

"totalSessionsPlayed": 99,

"totalSessionsLost": 2,

"totalSessionsWon": 1

}

}

}

]

例:

class ListMatchUps extends JsonStreamingParser\Listener\IdleListener

{

private $key;

private $summonerId;

private $championId;

private $inStats;

public function start_document()

{

$this->key = null;

$this->summonerId = null;

$this->championId = null;

$this->inStats = false;

}

public function start_object()

{

if ($this->key === 'stats') {

$this->inStats = true;

} else if ($this->inStats) {

$this->championId = $this->key;

}

}

public function end_object()

{

if ($this->championId !== null) {

$this->championId = null;

} else if ($this->inStats) {

$this->inStats = false;

} else {

$this->summonerId = null;

}

}

public function key($key)

{

$this->key = $key;

}

public function value($value)

{

switch ($this->key) {

case 'summonerId':

$this->summonerId = $value;

break;

case 'totalSessionsPlayed':

echo "{$this->summonerId},{$this->championId},$value\n";

break;

}

}

}

$stream = fopen('data.json', 'r');

$listener = new ListMatchUps();

try {

$parser = new JsonStreamingParser_Parser($stream, $listener);

$parser->parse();

} catch (Exception $e) {

fclose($stream);

throw $e;

}

输出:

24570940,110,3

24570940,112,45

555555,42,65

555555,88,99

拉解析器

这是使用我最近编写的解析器,pcrov/jsonreader(需要PHP 7.)

与上面相同的data.json.

例:

use pcrov\JsonReader\JsonReader;

$reader = new JsonReader();

$reader->open("data.json");

while($reader->read("summonerId")) {

$summonerId = $reader->value();

$reader->next("stats");

foreach($reader->value() as $championId => $stats) {

echo "$summonerId, $championId, {$stats['totalSessionsPlayed']}\n";

}

}

$reader->close();

输出:

24570940, 110, 3

24570940, 112, 45

555555, 42, 65

555555, 88, 99

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值