You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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不会做任何截断或补全操作,因此末尾空格不会追加

修复方案

修改逻辑如下:

  1. 每次循环开始时初始化单条记录的临时字符串变量,避免和上一条记录的内容混淆
  2. 单条记录内容拼接完成、补全到168字符后,再追加换行符
  3. 所有记录的内容统一拼接到全局输出变量中,最后写入文件
    修正后代码参考:
// 初始化全局输出变量
$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 16:54:03