Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在php中如何在控制台上进行对齐_Php_Command Line_Console_Alignment - Fatal编程技术网

在php中如何在控制台上进行对齐

在php中如何在控制台上进行对齐,php,command-line,console,alignment,Php,Command Line,Console,Alignment,我试图在PHP中通过命令提示符运行一个脚本,并试图以表格形式显示结果。但是由于单词的字符长度不同,我无法正确对齐显示结果 我想要这样的结果 Book ISBN Department Operating System 101 CS C 102 CS java 103 CS 任何人都可以帮助我在php控制台上获得这样的输出 提前感谢如果

我试图在PHP中通过命令提示符运行一个脚本,并试图以表格形式显示结果。但是由于单词的字符长度不同,我无法正确对齐显示结果

我想要这样的结果

Book                  ISBN      Department
Operating System      101       CS
C                     102       CS
java                  103       CS
任何人都可以帮助我在php控制台上获得这样的输出

提前感谢

如果您不想(或由于某种原因不允许)使用库,您可以使用标准的php/函数

他们的问题是,如果您的值是可变的且宽度不受限制的,那么您必须决定是截断长值还是打断表的布局

第一种情况:

// 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\u表的工作原理。

您可以使用:

帮助您在屏幕上显示表格数据 终端/外壳/控制台

示例:

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 |
+----------+------+
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 |
+----------+------+
输出:

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 |
+----------+------+
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 |
+----------+------+

您最好的选择是使用Pear包控制台表()

要使用-在控制台上,您需要安装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();

CLIFramework表格生成器帮助您轻松完成工作,它支持文本对齐、文本颜色、背景色、文本换行和文本溢出处理。。等

以下是教程:

示例代码:


如果不想使用标准PHP函数/或pear包,可以尝试最近的简单PHP库

示例:

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 |
+----------+------+
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 |
+----------+------+
输出:

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 |
+----------+------+
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 |
+----------+------+

查看更多示例用法。

太旧了,但我现在也使用了str_pad,只需将长度设置为列的大小即可


问候。

我在Github上发布了一个要点,以防有人想用PHP实现这一点

简单地说:

$output = $tablePrinter->printLinesIntoArray($items, ['title', 'chilProp2']);
如果使用的是早于7.2的php版本,则可能需要修改代码


之后,根据您的环境,呼叫echo或writeLine。

powtac-您在几秒钟内用相同的解决方案击败了我!非常感谢鲍勃的快速回复。我会照这个做,为什么?表中的值太长?然后首先需要在每列中找到最长的字符串。这看起来真的像是重新发明了一个轮子,因为powtac建议的PEAR解决方案为您实现了这一点。所以我放弃了我的答案,支持他的回答。+1-如果你不想选择库,
sprintf
是格式化输出的良好开端,请检查不同的可用格式:-你可以对表的标题行和数据行使用相同的掩码。谢谢@hakre。在您的评论之后,我认为我的答案没有那么糟糕,基于sprintf的解决方案值得进一步解释,因此我更新了我的答案。与其他答案不同,使用stru_pad可以在您拥有所有行内容之前回显内容,因此在这种情况下,这是一个更好的选择。