首页 > 解决方案 > PHP 创建一个具有预定义列和宽度的字符串

问题描述

我有这样的标准数据:

+------------+----------+-------+
| 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 个字符,如果字符少,则在其余部分放置空格。以此类推,以此类推。

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

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 我无法定义它的位置。请帮忙。

标签: phptext

解决方案


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

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);

3v4l.org 上的演示


推荐阅读