Используя тег <pre>для отображения данных в столбцах? - PullRequest
1 голос
/ 06 июля 2011

Я работаю с 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 - более длинная строка), но это не похоже на работу.

Вот мой код:

<code>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
";

Но он отображает:

string0gvmdksd                                  42134
string1fges                                 234
string2gvmdksd sgdfsgdfg gffgdfg                                    87342
string3gffd                                 34

У кого-нибудь есть решение для этого?

Ответы [ 6 ]

1 голос
/ 06 июля 2011

Если вам действительно нужно использовать тег <pre>, тогда лучше всего использовать функцию sprintf , например:

<code>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
";

OUTPUT

string0gvmdksd                      42134
string1fges                         234
string2gvmdksd sgdfsgdfg gffgdfg    87342
string3gffd                         34
1 голос
/ 06 июля 2011

ах, почему бы не поместить их в таблицу 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>
0 голосов
/ 06 июля 2011

Предполагая, что вы хотите отобразить данные БЕЗ границ таблицы, создайте таблицу, как предложили другие, и задайте стиль, чтобы не было границ и отступов между ячейками. Простое создание таблицы и ее заполнение приведет к появлению границ по умолчанию, отступов и интервалов между ячейками, что, как я подозреваю, не то, что вам нужно.

0 голосов
/ 06 июля 2011

Вкладка не нужна, и вы забыли вычесть ширину содержимого первого столбца!

Возможно, вы имели в виду следующее:

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> - это!

0 голосов
/ 06 июля 2011

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-таблица, конечно, будет намного проще!

0 голосов
/ 06 июля 2011

Вместо этого вы можете попробовать использовать тег 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>
...