当我执行它时,我在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
答案 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);
这样的东西,或者无论价值如何。