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

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

結果から

Zend_Text 2013-07-26 15-01-25

Contents

Zend_Text_Table

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 を使う

取り急ぎ対応したけれど、何かあれば見直そう。

補遺