2011-08-12 18 views
21

Estoy tratando de ejecutar una secuencia de comandos a través del símbolo del sistema en PHP y tratando de mostrar el resultado en forma de tabla. Pero debido a la diferente longitud de caracteres de las palabras, no puedo mostrar el resultado correctamente alineado.Cómo hacer la alineación en la consola en php

Quiero resultado como este

libro Departamento ISBN sistema operativo 101 CS 102 CS C java 103 CS

Puede alguien por favor me ayudará a conseguir este resultado como este en php en la consola.

Gracias de antemano

Respuesta

43

Si no quiere (o no permitidos por alguna razón) para utilizar las bibliotecas, puede utilizar PHP estándar printf/sprintf funciones.

El problema con ellos es que si tiene valores con ancho variable y no limitado, entonces deberá decidir si los valores largos se truncarán o romperán el diseño de la tabla.

Primer caso:

// 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'); 

La salida es

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

Segundo caso:

// 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'); 

Y aquí obtenemos

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

Si ninguno de los dos satisface sus necesidades y realmente necesita una tabla con columnas con ancho de flujo, tendrá que calcular el ancho máximo de los valores en cada columna. Pero así es como funciona exactamente PEAR::Console_Table.

+0

Lo intenté, pero sprintf no funciona en mi caso :( – user519846

+0

¿Por qué valores demasiado largos frenan la tabla? Entonces primero necesitas encontrar la cadena más larga en cada columna. Eso realmente parece reinventar una rueda, porque la solución PEAR sugerido por powtac hace eso por ti. Así que renuncio a mi respuesta y apoyo su. – Hnatt

+0

+1 - Si no quieres optar por una biblioteca (todavía), 'sprintf' es un buen comienzo para la salida formateada, verifica los diferentes formatos disponibles: http://php.net/manual/en/function.sprintf.php - puede usar la misma máscara para la fila del encabezado de su tabla, así como las filas de datos. – hakre

28

Puede utilizar PEAR::Console_Table:

Console_Table le ayuda a mostrar datos tabulares en un terminal de /shell/consola.

Ejemplo:

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(); 

Salida:

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

powtac - ¡me ganaste con la misma solución en pocos segundos! – dotbill

+0

@Billy Bob :) ¡Yay! – powtac

+0

Muchas gracias bob para una respuesta rápida. Seguiré esto. – user519846

7

Su mejor opción es utilizar el paquete de pera Console_Table (http://pear.php.net/package/Console_Table/).

de usar - en una consola que necesita para instalar el paquete de pera, ejecutando:

pear install Console_Table 

esto debe descargar el paquete e instalar.A continuación, puede utilizar un script de ejemplo como:

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(); 
0

El generador de tablas CLIFramework ayuda a conseguir el trabajo hecho con mucha facilidad y es compatible con la alineación del texto, color de texto, color de fondo, el ajuste de texto, texto manejo de desbordamiento .. etc.

Aquí está el tutorial: código https://github.com/c9s/CLIFramework/wiki/Using-Table-Component

muestra: 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(); 
2

Usted podría intentar la re centavo PHP simple biblioteca ConsoleTable si no desea utilizar las funciones estándar de PHP printf/sprintf o el paquete de pera PEAR::Console_Table.

Ejemplo:

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() 
; 

de salida:

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

Ver más usos ejemplo a its github page.

0

demasiado viejo, pero yo fui Trough lo mismo ahora y se utiliza str_pad, acaba de establecer la longitud como el tamaño de la columna y eso es todo

respecto.