如何用PHP将网站交易日志格式化为表格形式写入TXT文件?
PHP实现交易记录表格化写入TXT日志
要生成对齐整齐的表格式TXT交易日志,核心是通过字符串格式化保证每列宽度一致,以下是具体实现方案:
1. 定义格式规则
先确定日志的列字段和每列的显示宽度,可根据实际需求调整:
// 定义各列的显示宽度(考虑中文占2个字符宽度) $columnWidths = [ 'order_no' => 16, 'datetime' => 20, 'amount' => 12, 'status' => 10, 'user_id' => 8 ];
2. 生成表头与分隔线
为日志添加上表头和分隔线,让整体结构更清晰:
// 生成表头行(默认左对齐,可按需调整) $header = sprintf( "%-{$columnWidths['order_no']}s %-{$columnWidths['datetime']}s %{$columnWidths['amount']}s %-{$columnWidths['status']}s %-{$columnWidths['user_id']}s", '订单号', '交易时间', '交易金额', '状态', '用户ID' ); // 生成分隔线,长度匹配表头总宽度 $separator = str_repeat('-', array_sum($columnWidths) + count($columnWidths) - 1);
3. 格式化单条交易记录
用sprintf对交易数据进行格式化,保证列对齐:
// 模拟交易数据(实际可从业务逻辑中获取) $transaction = [ 'order_no' => 'ORD202405280001', 'datetime' => date('Y-m-d H:i:s'), 'amount' => '¥99.00', 'status' => '成功', 'user_id' => 'U12345' ]; // 格式化交易记录:金额右对齐,其余字段左对齐 $logLine = sprintf( "%-{$columnWidths['order_no']}s %-{$columnWidths['datetime']}s %{$columnWidths['amount']}s %-{$columnWidths['status']}s %-{$columnWidths['user_id']}s", $transaction['order_no'], $transaction['datetime'], $transaction['amount'], $transaction['status'], $transaction['user_id'] );
4. 写入TXT日志文件
以追加模式写入日志,避免覆盖已有内容,首次写入时自动添加表头:
$logFile = 'transaction_log.txt'; // 打开文件(追加模式,不存在则自动创建) $fileHandle = fopen($logFile, 'a'); if ($fileHandle) { // 文件为空时写入表头和分隔线 if (filesize($logFile) == 0) { fwrite($fileHandle, $header . PHP_EOL); fwrite($fileHandle, $separator . PHP_EOL); } // 写入格式化后的交易记录 fwrite($fileHandle, $logLine . PHP_EOL); fclose($fileHandle); }
优化:中文对齐处理
如果日志包含中文,默认sprintf按字节计算宽度会导致对齐错位,可封装函数处理:
function formatChineseString($str, $width, $align = 'left') { $strWidth = mb_strwidth($str, 'UTF-8'); $padding = $width - $strWidth; if ($padding <= 0) { return mb_substr($str, 0, $width - 1) . '…'; // 超长内容截断加省略号 } return $align == 'left' ? $str . str_repeat(' ', $padding) : str_repeat(' ', $padding) . $str; } // 使用函数生成对齐准确的日志行 $logLine = formatChineseString($transaction['order_no'], $columnWidths['order_no']) . ' ' . formatChineseString($transaction['datetime'], $columnWidths['datetime']) . ' ' . formatChineseString($transaction['amount'], $columnWidths['amount'], 'right') . ' ' . formatChineseString($transaction['status'], $columnWidths['status']) . ' ' . formatChineseString($transaction['user_id'], $columnWidths['user_id']);
内容的提问来源于stack exchange,提问作者Marco Sperindeo
相关产品推荐
相关产品推荐

