我有一个像这样的标准数据:
+------------+----------+-------+
| 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
我无法定义它的位置。请帮忙。
答案 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);
答案 1 :(得分:1)
也许您可以像使用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);
}
答案 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;
}