PHP拼接固定168字符字符串时str_pad补空格失效如何解决
固定长度字符串生成补空格失效问题修复
问题描述
业务要求单条生成的字符串固定长度为168字符:满足指定条件时末尾34位为业务字段内容,不满足条件时末尾补34个空格,每条完整字符串末尾拼接CR+LF作为换行符。
现有代码如下:
foreach($records as $record){ if($record['guest'].$record['guests']==11){ //se viaggia uno solo $string .='16'; }else{ if($record['guest']==1){ //se è il capogruppo $string .='18'; }else{ //se è un membro del gruppo $string .='20'; } } $string .=$record['checkin']; //data di arrivo $string .=str_pad($record['giorni'],2); //2 cifre per i giorni di permanenza $string .=str_pad($record['cognome'], 50); $string .=str_pad($record['nome'], 30); $string .=$record['sesso']; $string .=$record['dob']; if($record['nazione_nascita']=='100000100'){ //se è nato in italia $string .=$record['citta_nascita']; $provincia=$pdo->query("SELECT provincia FROM city WHERE codice='{$record['citta_nascita']}'")->fetchColumn(); //recupero la provincia del comune $string .=$provincia; }else{ $string =str_pad($string,115); } $string .=$record['nazione_nascita']; $string .= $record['nazionalita']; if($record['guest']==1){ //cliente ha inserito anche il numero di documento $string .=$record['tipoDocumento']; $numeroDocumento = str_pad($record['numeroDocumento'],20); $string .=$numeroDocumento; $string .= $record['citta_documento']; }else{ //gli altri ospiti che viaggiano con il capogruppo $string = str_pad($string,168); } $strlen=strlen($string); $strActual=$strlen-$strlenTotale; $strlenTotale=$strlenTotale+$strActual; echo $strActual; echo '<pre>'.$totale.' '.$i."\n".'</pre>'; if($totale!=$i){ $string .="\r\n"; } $i=$i+1; } $schedine = fopen("schedine.txt", "w+"); fwrite($schedine, $string); fclose($schedine);
运行结果:

第1、3行符合$record['guest']==1的条件,生成的字符串长度为168字符,第2、4行缺少末尾的34个空格,str_pad($string,168)未生效。
问题原因
问题和换行符无关,核心是你没有为每条记录单独初始化字符串变量:
- 全局共用同一个
$string变量,每次循环都是在上一条记录的完整内容(168字符+换行)基础上继续拼接 - 执行
str_pad($string,168)时,当前字符串长度已经远大于168,str_pad不会做任何截断或补全操作,因此末尾空格不会追加
修复方案
修改逻辑如下:
- 每次循环开始时初始化单条记录的临时字符串变量,避免和上一条记录的内容混淆
- 单条记录内容拼接完成、补全到168字符后,再追加换行符
- 所有记录的内容统一拼接到全局输出变量中,最后写入文件
修正后代码参考:
// 初始化全局输出变量 $output = ''; $total = count($records); foreach($records as $i => $record){ // 每次循环初始化单条记录的临时变量 $line = ''; if($record['guest'].$record['guests']==11){ $line .='16'; }else{ if($record['guest']==1){ $line .='18'; }else{ $line .='20'; } } $line .=$record['checkin']; $line .=str_pad($record['giorni'],2); $line .=str_pad($record['cognome'], 50); $line .=str_pad($record['nome'], 30); $line .=$record['sesso']; $line .=$record['dob']; if($record['nazione_nascita']=='100000100'){ $line .=$record['citta_nascita']; $provincia=$pdo->query("SELECT provincia FROM city WHERE codice='{$record['citta_nascita']}'")->fetchColumn(); $line .=$provincia; }else{ $line =str_pad($line,115); } $line .=$record['nazione_nascita']; $line .= $record['nazionalita']; if($record['guest']==1){ $line .=$record['tipoDocumento']; $numeroDocumento = str_pad($record['numeroDocumento'],20); $line .=$numeroDocumento; $line .= $record['citta_documento']; } // 统一补全到168字符,不用分条件处理 $line = str_pad($line, 168); // 非最后一条追加换行 if($i < $total - 1){ $line .= "\r\n"; } // 拼入全局输出 $output .= $line; } $schedine = fopen("schedine.txt", "w+"); fwrite($schedine, $output); fclose($schedine);
内容的提问来源于stack exchange,提问作者user2399035
相关产品推荐
相关产品推荐

