1

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

$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

有人对此有解决方案吗?

4

6 回答 6

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>
于 2011-07-05T22:51:19.433 回答
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
于 2011-07-05T23:01:28.220 回答
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>
于 2011-07-05T22:52:51.777 回答
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 表格会容易得多!

于 2011-07-05T22:56:36.617 回答
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>是!

于 2011-07-05T22:58:02.067 回答
0

假设您要做的是显示没有表格边框的数据,按照其他人的建议创建表格并设置样式,以便单元格之间没有边框和填充。只需创建一个表格并填充它就会产生默认的边框、填充和单元格间距,我怀疑这不是您想要的。

于 2011-07-05T23:01:37.330 回答