gpt4 book ai didi

php - 将生成器分成 block 的最佳方法

转载 作者:可可西里 更新时间:2023-10-31 22:52:53 24 4
gpt4 key购买 nike

你能帮我写这段代码,将生成器的产量分成 100 个 block ,并将它们更漂亮地保存到数据库中吗?

$batchSize = 100;

$batch = [];
$i = 0;

/**
* @yield array $item
*/
foreach(itemsGenerator() as $item) {
$batch[] = $item;
$i++;

if ($i === $batchSize) {
Db::table('items')->save($batch);

$batch = [];
$i = 0;
}

$cnt++;
}

if ($batch) {
Db::table('items')->save($batch);
}

我不想把分解成 block 的逻辑放在itemsGenerator

最佳答案

您可以将 block 逻辑放入一个单独的可重用函数中。

解决方案 1:每个 block 都是一个生成器。

https://3v4l.org/3eSQm

function chunk(\Generator $generator, $n) {
for ($i = 0; $generator->valid() && $i < $n; $generator->next(), ++$i) {
yield $generator->current();
}
}

function foo() {
for ($i = 0; $i < 11; ++$i) {
yield $i;
}
}

for ($gen = foo(); $gen->valid();) {
$chunk = [];
foreach (chunk($gen, 3) as $value) {
$chunk[] = $value;
}
print json_encode($chunk) . "\n";
}

解决方案 2:每个 block 都是一个数组。

https://3v4l.org/aSfeR

function generator_chunks(\Generator $generator, $max_chunk_size) {
$chunk = [];
foreach ($generator as $item) {
$chunk[] = $item;
// @todo A local variable might be faster than count(), but adds clutter to the code. So using count() for this example code.
if (count($chunk) >= $max_chunk_size) {
yield $chunk;
$chunk = [];
}
}
if ([] !== $chunk) {
// Remaining chunk with fewer items.
yield $chunk;
}
}

function generator() {
for ($i = 0; $i < 11; ++$i) {
yield $i;
}
}

foreach (generator_chunks(generator(), 3) as $chunk) {
print json_encode($chunk) . "\n";
}

现在,一个 block 的所有部分都将作为一个数组同时存储在内存中,但不是整个序列。

可能有办法让每个 block 的行为都像一个生成器。但这又是另一回事了。

关于php - 将生成器分成 block 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33730942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com