使用php中的\ t格式化列中的纯文本值

时间:2011-06-02 18:09:39

标签: php formatting pre

当我执行它时,我在php中有以下代码:

<pre>
<?php
$input = '<xml>
<user>
    <name>sujit agarwal</name>
    <age>22</age>
    <gender>male</gender>
</user>
<user>
    <name>ajay rana</name>
    <age>25</age>
    <gender>male</gender>
</user>
<user>
    <name>pratap singh</name>
    <age>27</age>
    <gender>male</gender>
</user>
<user>
    <name>asdfasdfasdfasdf</name>
    <age>30</age>
    <gender>male</gender>
</user>
</xml>';
$sx = simplexml_load_string($input);
foreach($sx as $val)
echo $val->name."\t".$val->gender."\t".$val->age."\n";
?>
</pre>

输出

sujit agarwal   male    22
ajay rana   male    25
pratap singh    male    27
asdfasdfasdfasdf    male    30

现在,我的问题是如何将列中的所有性别值和年龄值对齐,即使名称比其他名称长。希望我明白我的问题。 这是在PRE标签内完成的。因为我稍后会将其保存为TXT文件

需要格式化

sujit agarwal       male    22
ajay rana           male    25
pratap singh        male    27
asdfasdfasdfasdf    male    30

4 个答案:

答案 0 :(得分:1)

<?php
$input = '<xml>
<user>
    <name>sujit agarwal</name>
    <age>22</age>
    <gender>male</gender>
</user>
<user>
    <name>ajay rana</name>
    <age>25</age>
    <gender>male</gender>
</user>
<user>
    <name>pratap singh</name>
    <age>27</age>
    <gender>male</gender>
</user>
<user>
    <name>asdfasdfasdfasdf</name>
    <age>30</age>
    <gender>male</gender>
</user>
</xml>';
$sx = simplexml_load_string($input);

$output='';
foreach($sx as $val){
    $values[] = $val->name;
    $values[] = $val->gender;
    $values[] = $val->age;
    $output.=vsprintf("%-30s %s\t %d",$values)."\n";
    $values='';
}

echo '<pre>';
echo $output;
echo '</pre>';
?>

输出:

sujit agarwal                  male  22
ajay rana                      male  25
pratap singh                   male  27
asdfasdfasdfasdf               male  30

答案 1 :(得分:1)

我只需要快速解决这个shell脚本问题,该方法非常便于移植。

只需传递一个元素数组,并将列标签分开 - 它将返回一个格式化的字符串,其中的列间距正确。

function function formatCols($rows)
{
  $colwidth = array();
  $rowsParts = array();
  $results = null;
  foreach ($rows as $row) {
    $cols = explode("\t", $row);
    $rowsParts[] = $cols;
    foreach ($cols as $id => $col)
      if (!isset($colwidth[$id]) || strlen($col) > $colwidth[$id])
        $colwidth[$id] = strlen($col);
  }
  $colFormat = null;
  for ($i=0; $i<count($colwidth); $i++)
    $colFormat .= '%-'.$colwidth[$i].'s ';
  $colFormat = trim($colFormat)."\n";
  foreach ($rowsParts as $row)
    $results .= vsprintf($colFormat, $row);
  return $results;
}

答案 2 :(得分:0)

这不太难。

您需要做的是弄清楚每列的“宽”程度。然后找出需要添加多少个标签。 因此,您需要遍历所有行两次。首先确定每列的最大值是什么,然后“打印”数据加上适量的标签。

或者您可以使用HTML表来为您处理,但我可以理解它不是一个选项。

答案 3 :(得分:0)

你必须循环两次:1来建立每个单独字段的最大长度,第二个是用这么多空格写出来的(为此我推荐像vsprintf('%45s %7s %-3d',$args);这样的东西,或者无论价值如何。