У меня есть очень большой массив в PHP (5.6), сгенерированный динамически, который я хочу преобразовать в JSON. Проблема в том, что массив слишком большой, чтобы он не помещался в памяти - я получаю фатальную ошибку, когда пытаюсь его обработать (исчерпана память). Итак, я понял, что при использовании генераторов проблема с памятью исчезнет.
Это код, который я пробовал до сих пор (этот сокращенный пример не приводит к ошибке памяти):
<?php
function arrayGenerator()// new way using generators
{
for ($i = 0; $i < 100; $i++) {
yield $i;
}
}
function getArray()// old way, generating and returning the full array
{
$array = [];
for ($i = 0; $i < 100; $i++) {
$array[] = $i;
}
return $array;
}
$object = [
'id' => 'foo',
'type' => 'blah',
'data' => getArray(),
'gen' => arrayGenerator(),
];
echo json_encode($object);
Но, похоже, PHP не JSON-кодирует значения из генератора. Это вывод, который я получаю из предыдущего скрипта:
{
"id": "foo",
"type": "blah",
"data": [// old way - OK
0,
1,
2,
3,
//...
],
"gen": {}// using generator - empty object!
}
Можно ли JSON-кодировать массив, созданный генератором, не генерируя полную последовательность, прежде чем я вызову json_encode
?