この頃Apacheサーバが動いていないなと今ごろになって気づき、MacOSX Leopardでは、Apacheも2.xに、PHPも5.xに上がっていることだし、この際、ApacheはOSが提供するもので動かそうと決めた。OSがインストールするPHPはPearが使えないとか、gdも使えないとか、不満な点があるので、いつものように最新版をPHPのサイトからダウンロードしてきてコンパイルしたのだが、動かない。
なぜだ! ここで知ったのだが、PHPの実行ファイルはphp.dSYMといふ名前で/usr/binにインストールされていたのだ。何なんだ、このdSYMってのは。で、phpにシンボリックリンクをはってみたのだが、動かないのだ。Apacheの設定が、/etc/httpdから/etc/apache2に移ったことは判っている。
syslogを見たら、phpが問題でApache自体が起動に失敗している。コマンドラインでは動くから、そんなに困らないではあるが、不愉快である。何だかもう判らないから、昨夜は不貞腐れて寝てしまった。もちろん、それで何かが解決する訳はないのだけど。
表計算ソフトは好きではないのであまり使わない。私の環境では256項目しか並べられないというのも不便に感じるし、まあ、書くと長くなるので書かない嫌いな理由が13個ほどあるのだ。
表計算ソフトでも便利だと思うことがあって、表の縦横を入れ替えるのが簡単だというのがその一つだ。数値だけが縦横に並んだリストなら、行列として取り込んで一瞬で転置行列を作るというのはRでやってしまえるのだけれども、Rを使わずにPHPで転置行列を作りたいこともある。PHPのスクリプトの中で転置行列を作りたい場合は、当然のことながらいちいちRを呼びだすよりもPHP内で処理した方がはやいし簡単だ。もちろん、そういうときは表計算ソフトは使えない。
行列はPHPの二次元配列で表現可能である。配列の配列を作れば簡単だ。実は、恥ずかしながらそんな二次元配列の項目をarray[i][j]で表現できる(アクセスできる)ということになかなか気づかなかった。前に一度発見していて、それを忘れて数カ月前に再発見したところである。もう二度と忘れないように、転置行列を作るスクリプトとともにここに記しておくことにする。
行列はコンマ区切りのCSVで保存してあるとする。これなら私の嫌いな表計算ソフトでも簡単に開ける。それがcsv.csvという名前で保存してあって、転置したものをtcsv.csvというファイル名で出力・保存されるようにしたのが、下のスクリプトである。
<?php
$csv = file_get_contents("csv.csv");
$csv = ereg_replace("\x0D\x0A|\x0A|\x0D","\n",$csv);
$lines = explode("\n",$csv);
array_pop($lines);
$array0 = array();
foreach($lines as $line){
$vals = explode(",",$line);
$rno = count($vals);
array_push($array0,$vals);
}
$lno = count($array0);
$out = array();
for($r=0;$r<$rno;$r++){
$nline = array();
for($l=0;$l<$lno;$l++){
array_push($nline,$array0[$l][$r]);
}
array_push($out,$nline);
}
echo $lno."x".$rno."\n";
$output = "";
foreach($out as $oline){
$output .= implode(",",$oline);
$output .= "\n";
}
file_put_contents("tcsv.csv",$output);
?>
最初に、Excelで保存すると改行コードが好みのものとは違っていることがあるので、\nで扱えるようにしている。数値だけの行列だけでなく、もちろん文字列の表もCSV形式になっていれば行と列を入れ替えられる。ファイル名を$argvで受け取るようにしておけば、何かと便利かも。