Bạn sẽ muốn sử dụng trình phân tích cú pháp trực tuyến. Những điều này chỉ kéo các phần nhỏ của tệp của bạn vào bộ nhớ tại một thời điểm.
Chúng có một số hương vị khác nhau:bộ phân tích cú pháp đẩy giống SAX và bộ phân tích cú pháp kéo. Mô hình trình đọc XML:SAX so với trình phân tích cú pháp kéo XML cung cấp tổng quan về sự khác biệt.
Trình phân tích cú pháp đẩy
Đây là một ví dụ nhanh bằng cách sử dụng salsify / json-streaming-parser.
Khi nó cuộn qua tệp, chúng tôi sẽ theo dõi summonerId
, championId
và trạng thái. Tất cả đều dựa trên sự kiện - bạn không có quyền truy cập ngẫu nhiên với trình phân tích cú pháp tuần tự, vì vậy bạn phải tự theo dõi mọi thứ. Mỗi lần một totalSessionsPlayed
xuất hiện, nó sẽ phát ra summonerId , ChampionId và totalSessionsPlayed .
data.json
Đây là một tệp json được ghép nối cho mục đích trình diễn.
[
{
"_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
}
}
}
]
Ví dụ:
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;
}
Đầu ra:
24570940,110,3
24570940,112,45
555555,42,65
555555,88,99
Trình phân tích cú pháp kéo
Điều này đang sử dụng trình phân tích cú pháp mà tôi đã viết gần đây, pcrov / jsonreader (yêu cầu PHP 7.)
Cùng data.json như trên.
Ví dụ:
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();
Đầu ra:
24570940, 110, 3
24570940, 112, 45
555555, 42, 65
555555, 88, 99