【问题标题】:How to assign SplFileObject::fpassthru output to variable如何将 SplFileObject::fpassthru 输出分配给变量
【发布时间】:2021-01-12 13:30:17
【问题描述】:

我目前正在将一些数据写入SplFileObject,如下所示:

$fileObj = new SplFileObject('php://text/plain,', "w+");

foreach($data as $row) {

    $fileObj->fputcsv($row);
}

现在,我想将整个输出(字符串)转储到一个变量中。

我知道SplFileObject::fgets 逐行获取输出(这需要循环),但我想一口气得到它,理想情况下是这样的:

$fileObj->rewind();
$output = $fileObj->fpassthru();

但是,这不起作用,因为它只是打印到标准输出。

有一个解决方案可以使用stream_get_contents()

pass fpassthru contents to variable

但是,该方法需要您直接访问文件句柄。

SplFileObject 将文件句柄隐藏在私有属性中,因此无法访问。

还有什么我可以尝试的吗?

【问题讨论】:

  • 简单的输出缓冲...?
  • @CBroe 好主意。希望可能有一个内置功能。但这可能是要走的路

标签: php csv splfileobject


【解决方案1】:

写完后,做一个 rewind() 然后你就可以阅读所有内容了。这个例子是为了理解:

$fileObj = new SplFileObject('php://memory', "w+");
    
$row = [1,2,'test'];  //Test Data
    
$fileObj->fputcsv($row);
$fileObj->rewind();
    
//now Read
$rowCopy = $fileObj->fgetcsv();
    
var_dump($row == $rowCopy);//bool(true)

$fileObj->rewind();
$strLine = $fileObj->fgets();  //read as string
$expected = "1,2,test\n";

var_dump($strLine === $expected);  //bool(true)

//several lines
$fileObj->rewind();
$fileObj->fputcsv(['test2',3,4]);
$fileObj->fputcsv(['test3',5,6]);

$fileObj->rewind();
for($content = ""; $row = $fileObj->fgets(); $content .= $row);

var_dump($content === "test2,3,4\ntest3,5,6\n");  //bool(true)

如果您绝对必须只使用一个命令来获取您的内容,那么您也可以这样做

// :
$length = $fileObj->ftell(); 
$fileObj->rewind();
$content = $fileObj->fread($length);

getSize() 在这里不起作用。

【讨论】:

  • 如果您向 $fileObj 添加更多行,您会注意到 fgets 一次只会返回一行。我想得到全部
  • 您可以通过一个简单的循环使用 fgets() 读取所有行。我已经添加了示例。
  • 谢谢,我知道循环和调用fgets(),但我想避免它
  • 我添加了另一个变体。
  • 完美。为我工作!
【解决方案2】:

在没有内置函数的情况下,我决定按照@CBroe 的建议进行 php 输出缓冲。

...

$fileObj->rewind();

ob_start();

$fileObj->fpassthru();

$buffer = ob_get_clean();

查看@jsplit 的答案,了解使用SplFileObjects 内置函数的更好方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 2011-01-28
    • 2017-09-28
    • 2012-12-12
    • 2018-05-18
    • 1970-01-01
    相关资源
    最近更新 更多