Skip to content

Instantly share code, notes, and snippets.

@wkw
Forked from tony-landis/array-to-texttable.php
Created September 29, 2017 15:49
Show Gist options
  • Select an option

  • Save wkw/129b9d873a49f1c933650a538e1b11b1 to your computer and use it in GitHub Desktop.

Select an option

Save wkw/129b9d873a49f1c933650a538e1b11b1 to your computer and use it in GitHub Desktop.

Revisions

  1. tony-landis created this gist Dec 3, 2008.
    197 changes: 197 additions & 0 deletions array-to-texttable.php
    Original file line number Diff line number Diff line change
    @@ -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;
    }
    }
    ?>