PHP创建具有预定义列和宽度的字符串

时间:2018-11-23 08:07:01

标签: php text

我有一个像这样的标准数据:

+------------+----------+-------+
| name       | position | width |
+------------+----------+-------+
| REFERENCE  |       20 |     9 |
| TRNSXN     |       48 |    14 |
| ESTIM_DATE |       64 |     8 |
+------------+----------+-------+
3 rows in set (0.00 sec)

我的目标是创建一个字符串,在其中可以定义每个元素的位置和宽度,类似这样

                   ETL                         E7954           20181123

如您所见 第一个字符串为REFERENCE = "ETL";从20开始,最多9个字符。如果空间不足,请留出空间。

第二个字符串为TRNSXN = E7954;以48个字符开头,最多14个字符,如果少于14个字符,则其余部分留空格。如此等等。

到目前为止,这是我的代码:

private function preFormattedText($string, $width)
{
    return str_pad($string, $width, " ", STR_PAD_RIGHT);
}

public function actionHermesAnsi($id)
{
    $modelWestims =getDataAsAboveDescription ;


    $stringWestim = null;
    $stringWestim .= $this->preFormattedText('ETL', (int)$modelWestims[0]['width']);
    $stringWestim .= $this->preFormattedText('E7954', (int)$modelWestims[1]['width']);

    header("Content-type: text/plain");
    header("Content-Disposition: attachment; filename=westim.txt");

    print $stringWestim;
    exit();
}

我得到了ETL E7954 我无法定义它的位置。请帮忙。

3 个答案:

答案 0 :(得分:2)

这样的事情会做你想要的:

function formatStrings($strings, $positions) {
    $position = 0;
    foreach ($strings as $key => $str) {
        // do we need to move to a new position to display the next string?
        if ($positions[$key]['position'] > $position) {
            echo str_pad('', $positions[$key]['position'] - $position - 1);
            $position = $positions[$key]['position'];
        }
        // display the string
        echo str_pad($str, $positions[$key]['width']);
        $position += $positions[$key]['width'] - 1;
    }
}

$strings = array('ETL','E7954','20181123');
$positions = array(array('position' => 20, 'width' => 9),
                   array('position' => 48, 'width' => 14),
                   array('position' => 64, 'width' => 8));
echo formatStrings($strings, $positions);

Demo on 3v4l.org

答案 1 :(得分:1)

也许您可以像使用STR_PAD_LEFT一样将positionwidth一起使用,并删除length中的$stringWestim

private function preFormattedText($stringWestim, $string, $width, $position)
{
    $string = str_pad($string, $position - strlen($stringWestim), " ", STR_PAD_LEFT );
    return str_pad($string, $width, " ", STR_PAD_RIGHT);
}

答案 2 :(得分:0)

感谢@Nesku和@Nick。

我使用尼克的答案,根据我的需要进行了一些修改,例如:

private function formatStrings($strings, $positions)
{
    $position = 0;
    $returnString = null;
    foreach ($strings as $key => $str) {
        // do we need to move to a new position to display the next string?
        if ($positions[$key]['position'] > $position) {
            $returnString .= str_pad('', $positions[$key]['position'] - $position - 1);
            $position = $positions[$key]['position'];
        }
        // display the string
        $returnString .= str_pad($str, $positions[$key]['width']);
        $position += $positions[$key]['width'] - 1;
    }

    return $returnString;
}