多次元配列をソートする

2007/12/10 | PHPの基本

とある案件で、配列に格納されたデータをソートする処理が必要になった。
今までは、基本的にデータの保存にはデータベースを使用していたので、配列としてデータを取り扱う以前にデータのソートは完了しているのが常だった。しかし今回データベースを使用せず、CSV形式で与えられていたので、配列に格納されたデータをソートする必要が出てきたわけだ。
実はこの処理、それほど難しいわけではなく、PHPで標準装備の関数で対応できる。それがarray_multisort関数だ。ただコマンド一発!というわけではなく、事前準備が必要となる。処理内容は以下の通り。

foreach ($data as $key => $row) {
$volume[$key] = $row[‘volume’];
$edition[$key] = $row[‘edition’];
}
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);

条件としてデータ「$data」が多次元配列で、その各行でいくつかのデータが指定され、かつ、それらのデータのうち「volume」「edition」というキーで与えられた値を元にソートするものとする。

最初のforeach文で、各行の「volume」「edition」のキーで指定された値をあらかじめ全て取り出して、変数に格納しておく必要がある。これを使い、array_multisort関数にデータ、ソート対象を引き渡す。関数が実行されると$dataがソートされている、というわけだ。

この関数、引数の与え方が他の関数とずいぶん違うので、使用する際は注意が必要になる。上記の例では、


第1引数:あらかじめ抽出したソート対象の配列
第2引数:ソート方法(昇順、降順)
:(上記2つの繰り返し)
最後の引数:データ

となっている。これは時としてこんな具合にもなる


第1引数:あらかじめ抽出したソート対象の配列
第2引数:ソート方法(昇順、降順)
第3引数:ソートのフラグ(文字列として、数値として等)
:(上記3つの繰り返し)
最後の引数:データ

慣れるまでは注意が必要な関数だ。

WordPressの表記を変更

2007/12/08 | SNS/CMS/ブログ

とある案件で、WordPressをCMSとして利用し、かつメンバーしか閲覧できないようにするためのシステムを作っている。ブログツールにはたいてい標準でユーザ管理機能がついているので、それを使えばユーザ管理機能は作成する必要がない。それにWordPressならプラグインを使って、ユーザ管理データベースと連携した認証システムを組み込むこともできるからだ。
さてこのWordPress。テンプレートとかのデザインが変更できるのはもちろんだが、言語ファイルを作成するだけで、多言語に対応できる。しかしその言語ファイル。これはPHPで書かれているものではない・・・それが厄介。
言語ファイル自体は「wp-includes/language/」ディレクトリ内に存在するのだが、同じファイル名で異なる拡張子を持つ対のファイルがいくつか存在している。拡張子はpoとmoの二つだが、WordPressが実際に使用しているのはmoのほう。これ、中を見ようとするとバイナリなんだな・・・。お手軽に編集して済むということではなさそうだ。
で、その編集方法を調べてみた。やり方としてはpoファイルを作成し、そこからmoファイルに変換するようだ。

(1) 拡張子poのファイルをテキストエディタで編集する
(2) コンソール上で適当なディレクトリで以下のコマンドを入力
 msgfmt -o ja_UTF.mo ja_UTF.po
(3) できたファイルを上記のディレクトリへ配置

これでできあがり。
どうしてこんな面倒なことになっているんだろ?。多言語対応というのは、きっとこういうところが大変なんだろうな。

WordPressのログインに時間がかかる

2007/12/02 | SNS/CMS/ブログ

WordPressにログインする際、たいてい非常に時間がかかる(wp-admin/index.php)。これはWordPressに関する重要な更新情報等々が提供されているRSSをインターネット経由で読み込んでいるためで、これに時間を要している。いってみれば、ちょっとお節介な機能だ。自動で取得するのではなくて、ボタンをクリックしたら読み込む、みたいな処理にしてくれればいいのに・・・(って、そこまで自分で作りこむ時間が今取れない)。
んで、それをハックした人がいる。以下のURL。

http://blog.taragana.com/

上記で紹介されている「Angsuman’s Dashboard hack」を使うとRSSの読み込みをとめることができる。

ダウンロードはこちらから。

ダウンロードしたファイルを解凍し、その中にあるindex.phpをwp-admin/index.phpと差し替える(プラグインではないので、WordPress本体に改造を加えるので、バージョンアップの際等は注意が必要)。

これでログインが快適になる。

セッション絡みのエラー

とある既存システムの改修作業をしていて、こんなエラーメッセージに出会った。

Warning: Unknown(): Your script possibly relies on a session side-effect which existed until PHP 4.2.3. Please be advised that the session extension does not consider global variables as a source of data, unless register_globals is enabled. You can disable this functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to off, respectively. in Unknown on line 0

これはどうもセッションへ変数とグローバル変数絡みのエラーのように見受けられる。「セッション機能はregister_globalsをonにしない限り、グローバル変数をデータのソースとして認識しません」。意味がよくわかんない。

まぁ、文章から判断して「register_globals」をonに設定するか、「session.bug_compat_42」か「session.bug_compat_warn」をoffにするか、で対応できる模様。

(1)「register_globals」をon
 動作した
(2)「session.bug_compat_42」をoff
 動作した
(3)「session.bug_compat_warn」をoff
 動作しなかった

それぞれをhtaccessファイルで設定してみたら、上記のような結果になった。ということで(2)を採用した。
これって結局はPHPのバグということなのかな。

WordPressメールフォームプラグインCWCFバージョンアップ

2007/11/28 | SNS/CMS/ブログ

WordPressのメールフォームプラグインCWCFのバージョンを0.6にして公開することにした。以下のリンクからどうぞ。

WordPress Contact Form Plugin CWCF 0.6

■ 変更点
セッションの使用をやめた。

■ メモ
WordPress2.0系のバグかもしれないのだが、プラグインを作成してそのトリガを「the_content」としているのだが、どういうわけか2度処理が呼び出される。2回処理が呼ばれるので、メールが2通送信される。これはかなり気持ち悪い。
原因を詳しく突き止めようとはしていないが、前バージョン(0.5)ではセッションでメール送信実行の可否を判別するルーチンを持っていた(簡単なスパム対策も入れ込んであった)。でも基本的にセッションは使用したくなかったので、そこの部分についてのみ修正した。

ほんとはもうちょっとまじめにプログラムの中身を見ないといけないのかもしれないけれど・・・。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net