PHP使用fwrite写入文件时如何在循环中递增LaTeX问题块序号
实现方案
在循环外维护独立的自增计数器,每次写入前替换LaTeX中对应位置的固定序号即可,步骤如下:
- 进入while遍历循环前,初始化题号计数器,初始值为1
- 每次循环中,先把计数器格式化为两位带前导零的字符串(匹配现有
{01}的格式规范),替换待写入内容里的固定序号 - 内容写入完成后计数器自增,进入下一轮循环
代码参考
// 打开目标文件 $fo = fopen($newName, 'w') or die("can't open file"); // 初始化题号计数器 $questionNo = 1; // 数据库结果集遍历逻辑 while ($row = mysqli_fetch_assoc($result)) { // 格式化当前题号为两位,不足位补前导零,自动适配1-9显示01-09、10及以上显示10、11的格式 $currentNo = sprintf('%02d', $questionNo); // 替换LaTeX片段中的固定序号,下面两种方案二选一即可 // 方案1:固定匹配{01}替换,性能更好,适合数据库里存的LaTeX模板固定为{01}的场景 $writeContent = str_replace('{01}', '{'.$currentNo.'}', $row['entetequestionmonochoix']); // 方案2:正则匹配第一个花括号包裹的数字替换,容错性更高,就算后续模板里的初始序号改成{1}/{001}也能正常工作 // $writeContent = preg_replace('/\{\d+\}/', '{'.$currentNo.'}', $row['entetequestionmonochoix'], 1); // 写入内容 fwrite($fo, $writeContent . PHP_EOL); // 序号自增 $questionNo++; } // 写入完成后关闭文件句柄 fclose($fo);
注意点
- 如果不需要两位前导零的格式,直接用
$questionNo替换即可,省去sprintf格式化步骤 - 所有内容写入完成后记得调用
fclose($fo)释放文件句柄,避免文件写入异常
内容的提问来源于stack exchange,提问作者fahaf37141
相关产品推荐
相关产品推荐

