
本文介绍如何在使用 fwrite() 生成 LaTeX 格式试题文件时,自动将模板中的 {01} 替换为递增的两位数字编号(如 {02}、 {03}),确保每道题编号唯一且格式规范。
本文介绍如何在使用 `fwrite()` 生成 latex 格式试题文件时,自动将模板中的 `{01}` 替换为递增的两位数字编号(如 `{02}`、 `{03}`),确保每道题编号唯一且格式规范。
在批量导出 MySQL 数据为 LaTeX 试题文件(如用于 Exercice 或 AMC 工具)时,常需将数据库中存储的模板字符串(如 \begin{question}{01}\scoring{b=1,e=0,m=0,V=0})动态注入连续编号。由于 fwrite() 本身不支持模板变量解析,必须在写入前对内容进行预处理。
核心思路是:用计数器变量控制序号,并借助 sprintf() 生成带前导零的格式化编号(如 01, 02, …, 99),再通过 str_replace() 精准替换模板占位符 {01}。
以下为完整可运行示例:
<?php
$fo = fopen($newName, 'w') or die("无法打开文件: " . $newName);
$i = 1;
while ($row = $results->fetch_assoc()) {
// 将模板中的 {01} 替换为当前序号(两位数字,不足补零)
$line = str_replace('{01}', sprintf('{%02d}', $i++), $row['entetequestionmonochoix']);
fwrite($fo, $line . PHP_EOL);
}
fclose($fo);
?>
✅ 关键说明:
立即学习“PHP免费学习笔记(深入)”;
- sprintf(‘{%02d}’, $i++) 确保输出形如 {01}、{02}…{99},避免 {1} 这类非法格式;
- str_replace() 是精确字符串替换,仅匹配字面量 {01},不会误改其他含 01 的内容(如分数 1/01 或时间 10:01);
- 若需兼容三位数编号(如 {100}),可改为 sprintf(‘{%03d}’, $i++) 并确保模板占位符统一为 {001};
- 注意: 模板字段(如 $row[‘entetequestionmonochoix’])中必须严格包含 {01} 字符串,不可写作 01 或 [01],否则 str_replace() 无法匹配。
⚠️ 常见陷阱提醒:
- 不要使用 str_replace(’01’, …) —— 它会错误替换所有出现的 01,破坏数据完整性;
- 避免在循环外定义 $i 后忘记自增($i++ 必须在 sprintf 内或紧随其后执行);
- 建议在 fopen() 后添加 if (!$fo) { /* 错误处理 */ } 提升健壮性;
- 如需跳过空行或过滤无效记录,应在 fwrite() 前加入 if (!empty($line)) 判断。
该方法轻量、可靠,无需引入 Twig 或 Smarty 等模板引擎,适用于任何基于字符串模板的批量文件生成场景。
文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/xinjizixun/127014.html