[Zend Framework] Zend_Text: テキストの表を作成する

Zend_Text_Table を利用して、表をテキストで表示します。
plain text table とか ascii text table と呼ばれているようです。

結果から
Zend_Text 2013-07-26 15-01-25

Zend_Text_Table

  • Zend_Text_Table(日本語) – Zend_Text – Zend Framework
  • Zend Framework – Zend_Text_Table promted to trunk
  • Zend Framework2.1.4 ZendTextTable – 弱小PHPerの憂鬱
    public function textTableAction()
          {
              $data = array(
              array('title' => '路傍の石', 'author' => '山本有三', 'pub' => '1937'),
              array('title' => '羅生門', 'author' => '芥川龍之介', 'pub' => '1915'),
              array('title' => '城の崎にてa思い出して走る城の崎にて思い出して走る', 'author' => '志賀直哉', 'pub' => '1917')
              );
              $this->view->assign('data', $data);
              // Text Table を作成する
              $options = array(
                  'columnWidths' => array(20, 16),
                  'AutoSeparate' => Zend_Text_Table::AUTO_SEPARATE_HEADER,
      //            'decorator'  => 'Ascii',
                  'padding'    => 1,
              );
              $table = new Zend_Text_Table($options);
          //                    $table->setOutputCharset('ISO-2022-JP');
              $table->setInputCharset('utf-8');
              $row = new Zend_Text_Table_Row();
      //        $table->appendRow(array('Title', 'Sum. (hour)'));
              $row->appendColumn(new Zend_Text_Table_Column('Title'));
              $row->appendColumn(new Zend_Text_Table_Column('Sum. (hour)', 'right'));
              $table->appendRow($row);
              foreach ($data as $value) {
                  $row = new Zend_Text_Table_Row();
                  $row->appendColumn(new Zend_Text_Table_Column("$value[title]"));
                  $row->appendColumn(new Zend_Text_Table_Column("$value[author]", 'right'));
                  $table->appendRow($row);
              }
              $this->view->assign('table', $table);
      
  • 横幅の指定が必須
  • 全角文字があると罫線がずれる

ArrayToTextTable

array-to-texttable.php を利用してみました。

<?php
    $renderer = new ArrayToTextTable($this->data);
    $renderer->showHeaders(true);
?>
<pre>
<?= $renderer->render(); ?>
</pre>
  • 全角文字があると罫線がずれる
  • 全角と半角が混じると文字化けする

ArrayToTextTable Fix

array-to-texttable.php の該当箇所を調べながら修正し、望んだような形式で出力できました。
* strlen でバイト数を数えているが、日本語全角は2-3byte。
【変更】SJISに変換し、全角を2文字と数える
* $maxWidth を越えた文字をsubstrで丸めているため文字化ける
【変更】substr ではなく、mb_strcut を使う

補遺