Source for file Table.php
Documentation is available at Table.php
// +-----------------------------------------------------------------------+
// | Copyright (c) 2002-2003 Richard Heyes |
// | All rights reserved. |
// | Redistribution and use in source and binary forms, with or without |
// | modification, are permitted provided that the following conditions |
// | o Redistributions of source code must retain the above copyright |
// | notice, this list of conditions and the following disclaimer. |
// | o Redistributions in binary form must reproduce the above copyright |
// | notice, this list of conditions and the following disclaimer in the |
// | documentation and/or other materials provided with the distribution.|
// | o The names of the authors may not be used to endorse or promote |
// | products derived from this software without specific prior written |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
// +-----------------------------------------------------------------------+
// | Author: Richard Heyes <richard@phpguru.org> |
// +-----------------------------------------------------------------------+
// $Id: Table.php,v 1.8 2005/07/16 16:54:44 richard Exp $
// Utility for printing tables from cmdline scripts
define('CONSOLE_TABLE_HORIZONTAL_RULE', 1 );
define('CONSOLE_TABLE_ALIGN_LEFT', -1 );
define('CONSOLE_TABLE_ALIGN_CENTER', 0 );
define('CONSOLE_TABLE_ALIGN_RIGHT', 1 );
* The max number of columns in a row
* The max number of rows in the table
* Lengths of the columns, calculated
* when rows are added to the table.
* Some options that configure various
* How many spaces to use to pad the table
* Columns to calculate totals for
* Alignment of the columns
* Default alignment of columns
* @param int $align Default alignment
function Console_Table ($align = CONSOLE_TABLE_ALIGN_LEFT )
$this->_headers = array ();
$this->_cell_lengths = array ();
$this->_filters = array ();
$this->_col_align = array ();
$this->_defaultAlign = $align;
* Converts an array to a table. Must be a two dimensional array.
* @param array $headers Headers for the table
* @param array $data Data for the table
* @param bool $returnObject Whether to return the Console_Table object (default: No)
function fromArray ($headers, $data, $returnObject = false )
$table = &new Console_Table ();
$table->setHeaders ($headers);
foreach ($data as $row) {
return $returnObject ? $table : $table->getTable ();
* Adds a filter to the object. Filters are standard php callbacks which are
* run on the data before table generation is performed. Filters are applied
* in the order they're added. the callback function must accept a single
* argument, which is a single table cell.
* @param int $col Column to apply filter to
* @param callback $callback PHP callback to apply
function addFilter ($col, &$callback)
$this->_filters[] = array ($col, &$callback);
* Sets the alignment for the columns
* @param integer $col_id Column ID
* @param integer $align Alignment to set for this column
* -1 = left, 0 = center, 1 = right
* CONSOLE_TABLE_ALIGN_LEFT
* CONSOLE_TABLE_ALIGN_CENTER
* CONSOLE_TABLE_ALIGN_RIGHT
function setAlign ($col_id, $align = CONSOLE_TABLE_ALIGN_LEFT )
// -1 = left, 0 = center, 1 = right
$this->_col_align[$col_id] = $pad;
* Specifies which columns are to have totals calculated for them and
* added as a new row at the bottom.
* @param array $cols Array of column IDs (0 is first column, 1 is second etc)
function calculateTotalsFor ($cols)
$this->_calculateTotals = $cols;
* Sets the headers for the columns
* @param array $headers The column headers
function setHeaders ($headers)
$this->_headers = $headers;
$this->_updateRowsCols ($headers);
* Adds a row to the table
* @param array $row The row data to add
* @param array $append Whether to append or prepend the row
function addRow ($row, $append = true )
$this->_updateRowsCols ($row);
* Inserts a row after a given row number in the table. If $row_id
* is not given it will prepend the row.
* @param array $row The data to insert
* @param integer $row_id Row number to insert before
function insertRow ($row, $row_id = 0 )
$this->_updateRowsCols ($row);
* Adds a column to the table
* @param array $col_data The data of the column. Can be numeric or associative array
* @param integer $col_id The column index to populate
* @param integer $row_id If starting row is not zero, specify it here
function addCol ($col_data, $col_id = 0 , $row_id = 0 )
foreach ($col_data as $col_cell) {
$this->_data[$row_id++ ][$col_id] = $col_cell;
$this->_updateRowsCols ();
$this->_max_cols = max($this->_max_cols, $col_id + 1 );
* Adds data to the table. Argument should be
* a two dimensional array containing the data
* @param array $data The data to add to the table
* @param integer $col_id Optional starting column ID
* @param integer $row_id Optional starting row ID
function addData ($data, $col_id = 0 , $row_id = 0 )
foreach ($data as $row) {
foreach ($row as $cell) {
$this->_data[$row_id][$starting_col++ ] = $cell;
$this->_updateRowsCols ();
$this->_max_cols = max($this->_max_cols, $starting_col);
* Adds a Horizontal Seperator to the table
* Returns the table in wonderful
$this->_calculateTotals ();
return $this->_buildTable ();
* Calculates totals for columns
function _calculateTotals ()
if (!empty ($this->_calculateTotals)) {
foreach ($this->_data as $row) {
foreach ($this->_calculateTotals as $columnID) {
$totals[$columnID] += $row[$columnID];
$this->_data[] = $totals;
$this->_updateRowsCols ();
* Applies any column filters to the data
if (!empty ($this->_filters)) {
foreach ($this->_filters as $filter) {
foreach ($this->_data as $row_id => $row_data) {
$this->_data[$row_id][$column] = call_user_func($callback, $row_data[$column]);
* Ensures column and row counts are correct
function _validateTable ()
for ($i=0; $i< $this->_max_rows; $i++ ) {
for ($j=0; $j< $this->_max_cols; $j++ ) {
$this->_data[$i][$j] = '';
$this->_calculateCellLengths ($this->_data[$i]);
for ($i=0; $i< count($rows); $i++ ) {
for ($j=0; $j< count($rows[$i]); $j++ ) {
$rows[$i][$j] = str_pad($rows[$i][$j], $this->_cell_lengths[$j], ' ', $this->_col_align[$j]);
$row_begin = '|' . str_repeat(' ', $this->_padding);
$row_end = str_repeat(' ', $this->_padding) . '|';
$return[] = $row_begin . implode($implode_char, $rows[$i]) . $row_end;
$return[] = $this->_getSeparator ();
$return = $this->_getSeparator () . "\r\n" . implode("\n", $return) . "\r\n" . $this->_getSeparator () . "\r\n";
if (!empty ($this->_headers)) {
$return = $this->_getHeaderLine () . "\r\n" . $return;
* Creates a horizontal separator for header
* separation and table start/end etc
foreach ($this->_cell_lengths as $cl) {
$row_begin = '+' . str_repeat('-', $this->_padding);
$row_end = str_repeat('-', $this->_padding) . '+';
$return = $row_begin . implode($implode_char, $return) . $row_end;
* Returns header line for the table
function _getHeaderLine ()
// Make sure column count is correct
for ($i=0; $i< $this->_max_cols; $i++ ) {
if (!isset ($this->_headers[$i])) {
$this->_headers[$i] = '';
for ($i=0; $i< count($this->_headers); $i++ ) {
if (strlen($this->_headers[$i]) < $this->_cell_lengths[$i]) {
$this->_headers[$i] = str_pad($this->_headers[$i], $this->_cell_lengths[$i], ' ', $this->_col_align[$i]);
$row_begin = '|' . str_repeat(' ', $this->_padding);
$row_end = str_repeat(' ', $this->_padding) . '|';
$return[] = $this->_getSeparator ();
$return[] = $row_begin . implode($implode_char, $this->_headers) . $row_end;
function _updateRowsCols ($rowdata = null )
$this->_max_cols = max($this->_max_cols, count($rowdata));
switch ($this->_defaultAlign) {
// Set default column alignments
for ($i = count($this->_col_align); $i< $this->_max_cols; $i++ ) {
$this->_col_align[$i] = $pad;
* This function given a row of data will
* calculate the max length for each column
* and store it in the _cell_lengths array.
* @param array $row The row data
function _calculateCellLengths ($row)
for ($i=0; $i< count($row); $i++ ) {
$this->_cell_lengths[$i] = max(strlen(@$this->_headers[$i]), @$this->_cell_lengths[$i], strlen(@$row[$i]));
Documentation generated on Mon, 11 Mar 2019 14:17:10 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.
|