使用<pre> tag to display data in columns?</pre>

时间:2011-07-05 22:45:32

标签: php html string formatting pre

我正在使用PHP,我想在数组中显示一些数据(来自mysql数据库)。问题是第一列并不总是具有相同的长度,因此虽然第一列中包含较短字符串的某些行都已完全对齐,但在具有较大字符串的行中,第二列会更多地向右对齐。该数组如下所示:

$array[0][0] = "string0gvmdksd";
$array[0][1] = "42134";
$array[1][0] = "string1fges";
$array[1][1] = "234";
$array[2][0] = "string2gvmdksd sgdfsgdfg gffgdfg";
$array[2][1] = "87342";
$array[3][0] = "string3gffd";
$array[3][1] = "34";

我虽然有一个解决方案。获取数组[$ i] [0]中较长字符串的长度,然后设置一个带有X个空格的变量和一个末尾的选项卡(X是较长的字符串长度),但这似乎不起作用

这是我的代码:

function addTabs($input) {
    $length = 0;
    foreach($input as $entry) {
        if(strlen($entry[0])>$length) $length = strlen($entry[0]);
    }

    return str_repeat(" ", $length)."\t";
}

$data = "";
$tabs = addTabs( $array );
foreach( $array as $entry ) {
    $data .=  $entry[0] . $tabs . $entry[1] . "\n";
}

echo "<pre>$data</pre>";

但它显示:

string0gvmdksd                                  42134
string1fges                                 234
string2gvmdksd sgdfsgdfg gffgdfg                                    87342
string3gffd                                 34

任何人都有解决方案吗?

6 个答案:

答案 0 :(得分:1)

嗯,为什么不将它们放在HTML表格中?

<table>
   <tr>
      <td>row 1 column 1</td>
      <td>row 1 column 2</td>
   </tr>
   <tr>
      <td>row 2 column 1</td>
      <td>row 1 column 2</td>
   </tr>
</table>

答案 1 :(得分:1)

如果您真的必须使用<pre>标记,那么最好使用sprintf这样的函数:

function maxLen($input) {
    $length = 0;
    foreach($input as $entry)
        if(strlen($entry[0])>$length) $length = strlen($entry[0]);
    return $length;
}
$len = maxLen($array);
foreach( $array as $entry ) {
    $data .=  sprintf("%-$len"."s\t%s\n", $entry[0], $entry[1]);
}
echo "<pre>$data</pre>";

输出

string0gvmdksd                      42134
string1fges                         234
string2gvmdksd sgdfsgdfg gffgdfg    87342
string3gffd                         34

答案 2 :(得分:0)

您可能希望尝试使用HTML的<table>代码:

获取正确的标记,您的列将自动对齐。

<table>
    <tr>
        <td>string0gvmdksd</td>
        <td>42134</td>
    </tr>
    <tr>
        <td>string1fges</td>
        <td>234</td>
    </tr>
    <tr>
        <td>string2gvmdksd sgdfsgdfg gffgdfg</td>
        <td>87342</td>
    </tr>
    <tr>
        <td>string3gffd</td>
        <td>34</td>
    </tr>
</table>

答案 3 :(得分:0)

PHP有一个填充文本的函数(str_pad),所以你要做的就是遍历数组一次以计算每列的最长值,然后第二次显示它:

// work out the max length for each column
$columnWidth = array();
foreach ($array as $row) {
    foreach ($row as $index => $value) {
        if (!isset($columnWidth[$index]) || $columnWidth[$index] < strlen($value)) {
            $columnWidth[$index] = strlen($value);
        }
    }
}

// display the data
foreach ($array as $row) {
    foreach ($row as $index => $value) {
        echo str_pad($value, $columnWidth[$index]);
    }
    echo "\n";
}

你可能希望每列之间有一个小的间隙,在这种情况下只需在回声之后添加一些空格。

当然,HTML表格会更容易!

答案 4 :(得分:0)

不需要标签,您忘记减去第一列内容的宽度!

也许你的意思是:

function widthOfFirstColumn($input) {
    $length = 0;
    foreach($input as $entry) {
        if(strlen($entry[1])>$length) $length = strlen($entry[1]);
    }

    return $length;
}

$data  = "";
$width = widthOfFirstColumn($array);
foreach ($array as $entry) {
    $spaces = str_repeat(" ", $width - strlen($entry[0]));
    $data .=  $entry[0] . $spaces . $entry[1] . "\n";
}

当然,这不是提供表格数据的好方法:<table>是!

答案 5 :(得分:0)

假设您要执行的操作是显示没有表格边框的数据,按照其他人的建议创建表格并设置样式,以便单元格之间没有边框和填充。只是创建一个表并填充它将导致默认的边框,填充和单元格间距,我怀疑这不是你想要的。