我正在使用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
任何人都有解决方案吗?
答案 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)
假设您要执行的操作是显示没有表格边框的数据,按照其他人的建议创建表格并设置样式,以便单元格之间没有边框和填充。只是创建一个表并填充它将导致默认的边框,填充和单元格间距,我怀疑这不是你想要的。