【问题标题】:Format plain text values in columns using \t in php在 php 中使用 \t 格式化列中的纯文本值
【发布时间】:2011-06-02 18:09:38
【问题描述】:

我在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

【问题讨论】:

    标签: php html formatting pre


    【解决方案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
    

    【讨论】:

    • 这个答案并没有明确解决一个普遍的问题。如果name 超过 40 个字母,那么您的程序将失败。
    【解决方案2】:

    我只需要快速完成一个 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;
    }
    

    【讨论】:

      【解决方案3】:

      这并不难。

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

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

      【讨论】:

      • 我提到了为什么在这种情况下我需要使用\t,因为输出将存储在纯文本文件中。我不需要 html,因为这个脚本没有任何东西可以显示到网页上
      【解决方案4】:

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

      【讨论】:

      • 如果你的意思是非 HTML,那么是的,它只是你的字符串和空格,仅此而已,但一个非常简单的单行测试可以告诉你。
      猜你喜欢
      • 1970-01-01
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2011-03-18
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多