@@ -0,0 +1,197 @@
<?php
/**
* Array to Text Table Generation Class
*
* @author Tony Landis <[email protected] >
* @link http://www.tonylandis.com/
* @copyright Copyright (C) 2006-2009 Tony Landis
* @license http://www.opensource.org/licenses/bsd-license.php
*/
class ArrayToTextTable
{
/**
* @var array The array for processing
*/
private $ rows ;
/**
* @var int The column width settings
*/
private $ cs = array ();
/**
* @var int The Row lines settings
*/
private $ rs = array ();
/**
* @var int The Column index of keys
*/
private $ keys = array ();
/**
* @var int Max Column Height (returns)
*/
private $ mH = 2 ;
/**
* @var int Max Row Width (chars)
*/
private $ mW = 30 ;
private $ head = false ;
private $ pcen = "+ " ;
private $ prow = "- " ;
private $ pcol = "| " ;
/** Prepare array into textual format
*
* @param array $rows The input array
* @param bool $head Show heading
* @param int $maxWidth Max Column Height (returns)
* @param int $maxHeight Max Row Width (chars)
*/
public function ArrayToTextTable ($ rows )
{
$ this ->rows =& $ rows ;
$ this ->cs =array ();
$ this ->rs =array ();
if (!$ xc = count ($ this ->rows )) return false ;
$ this ->keys = array_keys ($ this ->rows [0 ]);
$ columns = count ($ this ->keys );
for ($ x =0 ; $ x <$ xc ; $ x ++)
for ($ y =0 ; $ y <$ columns ; $ y ++)
$ this ->setMax ($ x , $ y , $ this ->rows [$ x ][$ this ->keys [$ y ]]);
}
/**
* Show the headers using the key values of the array for the titles
*
* @param bool $bool
*/
public function showHeaders ($ bool )
{
if ($ bool ) $ this ->setHeading ();
}
/**
* Set the maximum width (number of characters) per column before truncating
*
* @param int $maxWidth
*/
public function setMaxWidth ($ maxWidth )
{
$ this ->mW = (int ) $ maxWidth ;
}
/**
* Set the maximum height (number of lines) per row before truncating
*
* @param int $maxHeight
*/
public function setMaxHeight ($ maxHeight )
{
$ this ->mH = (int ) $ maxHeight ;
}
/**
* Prints the data to a text table
*
* @param bool $return Set to 'true' to return text rather than printing
* @return mixed
*/
public function render ($ return =false )
{
if ($ return ) ob_start (null , 0 , true );
$ this ->printLine ();
$ this ->printHeading ();
$ rc = count ($ this ->rows );
for ($ i =0 ; $ i <$ rc ; $ i ++) $ this ->printRow ($ i );
$ this ->printLine (false );
if ($ return ) {
$ contents = ob_get_contents ();
ob_end_clean ();
return $ contents ;
}
}
private function setHeading ()
{
$ data = array ();
foreach ($ this ->keys as $ colKey => $ value )
{
$ this ->setMax (false , $ colKey , $ value );
$ data [$ colKey ] = strtoupper ($ value );
}
if (!is_array ($ data )) return false ;
$ this ->head = $ data ;
}
private function printLine ($ nl =true )
{
print $ this ->pcen ;
foreach ($ this ->cs as $ key => $ val )
print $ this ->prow .
str_pad ('' , $ val , $ this ->prow , STR_PAD_RIGHT ) .
$ this ->prow .
$ this ->pcen ;
if ($ nl ) print "\n" ;
}
private function printHeading ()
{
if (!is_array ($ this ->head )) return false ;
print $ this ->pcol ;
foreach ($ this ->cs as $ key => $ val )
print ' ' .
str_pad ($ this ->head [$ key ], $ val , ' ' , STR_PAD_BOTH ) .
' ' .
$ this ->pcol ;
print "\n" ;
$ this ->printLine ();
}
private function printRow ($ rowKey )
{
// loop through each line
for ($ line =1 ; $ line <= $ this ->rs [$ rowKey ]; $ line ++)
{
print $ this ->pcol ;
for ($ colKey =0 ; $ colKey < count ($ this ->keys ); $ colKey ++)
{
print " " ;
print str_pad (substr ($ this ->rows [$ rowKey ][$ this ->keys [$ colKey ]], ($ this ->mW * ($ line -1 )), $ this ->mW ), $ this ->cs [$ colKey ], ' ' , STR_PAD_RIGHT );
print " " . $ this ->pcol ;
}
print "\n" ;
}
}
private function setMax ($ rowKey , $ colKey , &$ colVal )
{
$ w = mb_strlen ($ colVal );
$ h = 1 ;
if ($ w > $ this ->mW )
{
$ h = ceil ($ w % $ this ->mW );
if ($ h > $ this ->mH ) $ h =$ this ->mH ;
$ w = $ this ->mW ;
}
if (!isset ($ this ->cs [$ colKey ]) || $ this ->cs [$ colKey ] < $ w )
$ this ->cs [$ colKey ] = $ w ;
if ($ rowKey !== false && (!isset ($ this ->rs [$ rowKey ]) || $ this ->rs [$ rowKey ] < $ h ))
$ this ->rs [$ rowKey ] = $ h ;
}
}
?>