1

当我执行它时,我在 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

4 回答 4

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
于 2011-06-02T19:20:29.623 回答
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;
}
于 2014-05-17T22:23:50.607 回答
0

这不是太难。

你需要做的是弄清楚每列有多“宽”。然后找出你需要附加多少标签。因此,您将需要遍历所有行两次。首先确定每列的最宽值是多少,然后“打印”数据加上适量的制表符。

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

于 2011-06-02T18:13:00.630 回答
0

您必须循环两次:第一次确定每个单独字段的最大长度,第二次用那么多空格写出来(我建议使用类似vsprintf('%45s %7s %-3d',$args);的东西,或者任何值。

于 2011-06-02T18:14:46.490 回答