gpt4 book ai didi

php - 对 "data output stream"使用 php yield/Generator::send()

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:46:35 24 4
gpt4 key购买 nike

我知道 yield 可用于创建数据迭代器,例如从 CSV 文件中读取数据。

function csv_generator($file) {    
$handle = fopen($file,"r");
while (!feof($handle)) {
yield fgetcsv($file);
}
fclose($file);
}

但是 Generator::send() 方法建议我可以对顺序写入执行相同的操作,而不是读取。

例如我想使用这样的东西:

function csv_output_generator($file) {
$handle = fopen('file.csv', 'w');
while (null !== $row = yield) {
fputcsv($handle, $row);
}
fclose($handle);
}

$output_generator = csv_output_generator($file);
$output_generator->send($rows[0]);
$output_generator->send($rows[1]);
$output_generator->send($rows[2]);
// Close the output generator.
$output_generator->send(null);

我认为以上内容会起作用。

但是用于关闭的 $output_generator->send(null); 似乎是错误的,或者不理想。这意味着我永远不能发送空值。这对于 csv 写入是可以的,但也许有发送 null 的用例。

有没有使用 php 生成器进行顺序写入的“最佳实践”?

最佳答案

并不是说这是一个了不起的想法,但如果你在谈论语义,这“感觉”很棒。

检查类。就像传入特定类的对象来终止生成器一样。喜欢:

// should probably use namespacing here.
class GeneratorUtilClose {}

class GeneratorUtil {
public static function close() {
return new GeneratorUtilClose;
}
}

function csv_output_generator($file) {
$handle = fopen('file.csv', 'w');

while (!(($row = yield) instanceof GeneratorUtilClose)) {
fputcsv($handle, $row);
}

fclose($handle);
}

$output_generator = csv_output_generator($file);
$output_generator->send($rows[0]);
$output_generator->send(GeneratorUtil::close());

在这里添加了一个小工厂以获得额外的语义糖。

关于php - 对 "data output stream"使用 php yield/Generator::send(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40383163/

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