PHP Создать строку с предопределенным столбцом и шириной - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть стандартные данные, подобные этим:

+------------+----------+-------+
| 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 ]

0 голосов
/ 23 ноября 2018

Примерно так будет делать то, что вы хотите:

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

0 голосов
/ 23 ноября 2018

Спасибо за @Nesku и @ Ник.

Я использую ответ Ника, небольшая модификация, основанная на моих потребностях, таких как:

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;
}
0 голосов
/ 23 ноября 2018

Может быть, вы можете использовать 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...