2011年2月9日水曜日

[PHP]動的な文字列を縦書で表示するためのサンプルみたいなもの

時々ある、文字を縦書きさせたいという仕様に対して
調べたこと、考えたことをメモとして残します

(1)解決法その1 CSSを使う
参考:http://www.tagindex.com/stylesheet/text_font/writing_mode.html

writing-mode: tb-rl;

で出来ますがIEのみの対応となるので実質意味がありません。
IE限定の環境であればできるかも

(2)画像化する

動的な文字列を画像化することは出来なくはないのですが下記に比べて
難易度が高いので却下です。

(3)文字を配列化して改行で対応
出力例は http://ii-s.heteml.jp/test.php
ソースサンプルは下記の通り。

<?
$name="原克志";
$address="東京都品川区";
$tel="03-1234-5678";//ここらが本来動的

//文字列のながさ取得
$name_len=mb_strlen($name,'utf-8');
$address_len=mb_strlen($address,'utf-8');
$tel_len=mb_strlen($tel,'utf-8');

//ハイフンは|へ
$name=str_replace('-','|',$name);
$address=str_replace('-','|',$address);
$tel=str_replace('-','|',$tel);

//見栄えのため全角化
//参考:http://astrodeo.com/blog/archives/122
$name=mb_convert_kana($name,'ASKV','utf-8');
$address=mb_convert_kana($address,'ASKV','utf-8');
$tel=mb_convert_kana($tel,'ASKV','utf-8');

/*他置換などは仕様に準じること、置換に関しては一つの
関数にまとめることを推奨*/


//配列初期化
$name_arr=array();
$address_arr=array();
$tel_arr=array();

//文字列を配列化
for($i=0;$i<$name_len;$i++){
$name_arr[]=mb_substr($name,$i,1,'utf-8');
}
for($i=0;$i<$address_len;$i++){
$address_arr[]=mb_substr($address,$i,1,'utf-8');
}

for($i=0;$i<$tel_len;$i++){
$tel_arr[]=mb_substr($tel,$i,1,'utf-8');
}
?>
<html>
<head>
<title>縦書きテスト</title>
</head>
<body>
<!--テーブルなとでこのとき気をつけるのは縦書きのため見栄え上と反対の順序で書く必要あり-->
<table border="1">
<tr>
<td valign="top"align="center">電<br />話</td>
<td valign="top"align="center">住<br />所</td>
<td valign="top"align="center">名<br />前</td>
</tr>
<tr>
<td valign="top"align="center"><? foreach($tel_arr as $value){ echo $value.'<br />';} ?></td>
<td valign="top"align="center"><? foreach($address_arr as $value){ echo $value.'<br />';} ?></td>
<td valign="top"align="center"><? foreach($name_arr as $value){ echo $value.'<br />';} ?></td>
</tr>

</table>
</body>
</html>