Как сделать выравнивание на консоли в php - PullRequest
26 голосов
/ 12 августа 2011

Я пытаюсь запустить скрипт через командную строку в PHP и пытаюсь показать результат в табличной форме. Но из-за разной длины символов в словах я не могу правильно отобразить результат.

Я хочу такой результат

Book                  ISBN      Department
Operating System      101       CS
C                     102       CS
java                  103       CS

Может кто-нибудь, пожалуйста, помогите мне получить такой вывод в php на консоли.

Заранее спасибо

Ответы [ 7 ]

57 голосов
/ 12 августа 2011

Если вы не хотите (или по какой-то причине не разрешаете) использовать библиотеки, вы можете использовать стандартные функции php printf / sprintf.

Проблема с ними в том, что если у вас есть значения с переменной и неограниченной шириной, вам придется решить, будут ли длинные значения усечены или нарушит макет таблицы.

Первый случай:

// fixed width
$mask = "|%5.5s |%-30.30s | x |\n";
printf($mask, 'Num', 'Title');
printf($mask, '1', 'A value that fits the cell');
printf($mask, '2', 'A too long value the end of which will be cut off');

Вывод

|  Num |Title                          | x |
|    1 |A value that fits the cell     | x |
|    2 |A too long value the end of wh | x |

Второй случай:

// only min-width of cells is set
$mask = "|%5s |%-30s | x |\n";
printf($mask, 'Num', 'Title');
printf($mask, '1', 'A value that fits the cell');
printf($mask, '2', 'A too long value that will brake the table');

И здесь мы получим

|  Num |Title                          | x |
|    1 |A value that fits the cell     | x |
|    2 |A too long value that will brake the table | x |

Если ни то, ни другое не удовлетворяетваши потребности и вам действительно нужна таблица с текущими столбцами ширины, чем вы должны рассчитать максимальную ширину значений в каждом столбце.Но именно так PEAR::Console_Table точно работает.

31 голосов
/ 12 августа 2011

Вы можете использовать PEAR :: Console_Table :

Console_Table помогает отображать табличные данные на терминал / оболочка / консоль.

Пример:

require_once 'Console/Table.php';

$tbl = new Console_Table();

$tbl->setHeaders(array('Language', 'Year'));

$tbl->addRow(array('PHP', 1994));
$tbl->addRow(array('C',   1970));
$tbl->addRow(array('C++', 1983));

echo $tbl->getTable();

Выход:

+----------+------+
| Language | Year |
+----------+------+
| PHP      | 1994 |
| C        | 1970 |
| C++      | 1983 |
+----------+------+
8 голосов
/ 12 августа 2011

Ваш лучший вариант - использовать консоль Pear Pack_Table (http://pear.php.net/package/Console_Table/).

Для использования - на консоли необходимо установить пакет pear, работающий:

pear install Console_Table

это должно загрузить пакет и установить. Затем вы можете использовать пример сценария, например:

require_once 'Console/Table.php';

$tbl = new Console_Table();
$tbl->setHeaders(
    array('Language', 'Year')
);
$tbl->addRow(array('PHP', 1994));
$tbl->addRow(array('C',   1970));
$tbl->addRow(array('C++', 1983));

echo $tbl->getTable();
2 голосов
/ 31 января 2016

Вы можете попробовать последнюю простую PHP-библиотеку ConsoleTable , если вы не хотите использовать стандартные функции PHP printf / sprintf или пакет pear PEAR :: Console_Table .

Пример:

require_once 'ConsoleTable.php';

$table = new LucidFrame\Console\ConsoleTable();
$table
    ->addHeader('Language')
    ->addHeader('Year')
    ->addRow()
        ->addColumn('PHP')
        ->addColumn(1994)
    ->addRow()
        ->addColumn('C++')
        ->addColumn(1983)
    ->addRow()
        ->addColumn('C')
        ->addColumn(1970)
    ->display()
;

Выход:

+----------+------+
| Language | Year |
+----------+------+
| PHP      | 1994 |
| C++      | 1983 |
| C        | 1970 |
+----------+------+

См. Больше примеров использования на его странице github .

1 голос
/ 30 мая 2016

Слишком стар, но теперь я прошел тот же путь и использовал str_pad, просто установил длину в качестве размера вашего столбца, и это

.

1 голос
/ 25 февраля 2015

Генератор таблиц CLIFramework помогает вам выполнять работу очень легко и поддерживает выравнивание текста, цвет текста, цвет фона, перенос текста, обработку переполнения текста и т. Д.

Вот учебник: https://github.com/c9s/CLIFramework/wiki/Using-Table-Component

Пример кода: https://github.com/c9s/CLIFramework/blob/master/example/table.php

use CLIFramework\Component\Table\Table;

$table = new Table;
$table->setHeaders([ 'Published Date', 'Title', 'Description' ]);
$table->addRow(array( 
    "September 16, 2014",
    "Title",
    "Description",
    29.5
));
$table->addRow(array( 
    "November 4, 2014",
    "Hooked: How to Build Habit-Forming Products",
    ["Why do some products capture widespread attention whil..."],
    99,
));
echo $table->render();
0 голосов
/ 13 февраля 2019

На всякий случай, если кто-то захочет сделать это в PHP, я разместил на Github гист

https://gist.github.com/redestructa/2a7691e7f3ae69ec5161220c99e2d1b3

, просто позвоните:

$output = $tablePrinter->printLinesIntoArray($items, ['title', 'chilProp2']);

вам может понадобитьсяадаптируйте код, если вы используете версию php старше 7.2

после этого вызова echo или writeLine, в зависимости от вашей среды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...