代码之家  ›  专栏  ›  技术社区  ›  Fadly Dzil

PHP使用预定义的列和宽度创建字符串

  •  2
  • Fadly Dzil  · 技术社区  · 7 年前

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

    3 回复  |  直到 7 年前
        1
  •  2
  •   Nick SamSmith1986    7 年前

    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

        2
  •  1
  •   Nesku    7 年前

    也许你可以用 STR_PAD_LEFT position 就像你对那个女人做的一样 width 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);
    }
    
        3
  •  0
  •   Fadly Dzil    7 年前

    谢谢@Nesku和@Nick。

    我使用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;
    }