[Zend Framework] Zend_Text: テキストの表を作成する
Zend_Text_Table を利用して、表をテキストで表示します。
plain text table とか ascii text table と呼ばれているようです。
結果から
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: Array to Text Table Generation Class Multibyte
- PHP Array to Text Tables
コントローラーでrequire_onceし、ビューファイル内に書いてみました。
<?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 を使う
取り急ぎ対応したけれど、何かあれば見直そう。