2007年02月08日

php:バイト数の取得(strlen は mb_strlen にオーバーロードされる)

strlen が mb_strlen にオーバーロード(置換)されてしまっている場合でも支障なくデータのバイト数を取得する方法です。

環境によっては strlen は ms_strlen にオーバーロードされているんですが(マニュアル:XCIV. マルチバイト文字列関数)、そんな場合、データのバイト数を取得するのに通常はどうするのでしょう?

$volm = strlen(bin2hex($data)) / 2;

$data:バイト数を取得したいデータ
$volm:データ長(byte)

これでマルチバイトのテキストでも画像でも、バイト数を取得できます。当たり前ですが。
ちなみに関数のオーバーロードに関する設定(mbstring.func_overload)は、ユーザスクリプトからはできません。php.ini か .htaccess、httpd.conf で設定可能です。

ずっとこれで通してきてます。
んが。実は、一般的な手法を知りたかったんですが、調べてもちょっと見つからなかったので、私なりのやり方です。
うーん。普通にコア関数があるのだろうか、見落としてるハズないんだけどなぁ。
posted by HiFa at 11:54| 愛知 ??| Comment(0) | TrackBack(1) | ときどきPHP | このブログの読者になる | 更新情報をチェックする

2007年01月27日

php:配列の次元数を調べる関数

配列がもつデータ(配列)のうち最大の深度を調べる関数です。
配列の各要素をスキャンして、その値が配列だった場合に、再帰的に再度スキャンします。これを繰り返して最大の深度(次元数)を調べます。

値渡し/参照渡し、どちらが有利かまでは考慮してません。php バージョンによって異なる可能性もあります。必要であれば適宜改造してください。ま、この程度のもので気にすることもないですね。巨大な配列で無い限り問題にはならないと思います。

巨大な配列の場合はアルゴリズム自体も見直す必要があります。
コードを簡易化するために関数のオーバーヘッドが、1回余分に掛かかるような処理が入ってます。など。

続きを読む
posted by HiFa at 11:02| 愛知 ??| Comment(0) | TrackBack(0) | ときどきPHP | このブログの読者になる | 更新情報をチェックする

2006年12月18日

PHP : オブジェクトメソッドを指定する可変関数について

オブジェクトメソッドを指定する可変関数について、前回流した分の補足です。
前回はこちら

例えば、$obj->ex = 'sleep'; として $obj->ex(); としても sleep は使えないですよね。ま、当然の話しで、オブジェクトメソッドを指定しているのに、オブジェクトにそのメソッドが無い。
※ $obj に sleep というメソッドがあれば call 出来ます。

実際に書いてみたのが以下のコード。書くまでも無くエラーになりますw

続きを読む
posted by HiFa at 17:10| 愛知 ??| Comment(0) | TrackBack(0) | ときどきPHP | このブログの読者になる | 更新情報をチェックする

PHP4コアでメソッドの動的な追加

PHP4 コアのみで、PECLの runkit 関数を使わずにメソッドの動的な追加(っぽい事)をやってみます。

登録した関数をオブジェクト内部から呼び出す事と、メソッドの動的な生成です。

同日修正:コード修正しました。
すみません。ポカミスってました。呼び出される関数で $this に受け取っていたので、$slf へ受け取ります。

続きを読む
posted by HiFa at 03:55| 愛知 ??| Comment(0) | TrackBack(0) | ときどきPHP | このブログの読者になる | 更新情報をチェックする

2006年12月12日

php : mbstring.encoding_translation って痛いかも?

mbstring.encoding_translation って意外と曲者

例えば php.ini で。
mbstring.internal_encoding = EUC-JP
mbstring.encoding_translation = On


なんて感じになっていると、php コードの頭に
mb_internal_encoding("UTF-8");

と指定しても POST されたデータなんかは UTF-8 にならない。
当たり前だけど、時すでに遅し。プロセスがデータ受け取る時にはすでに EUC にエンコードされちゃってる。

EUC でしかドキュメント作らねーなんて今までが平穏&ラッキー過ぎた。こんなしょーもないことでえらい事悩んでしまった・・・。

デフォじゃ off だけど、有効にしてるレンサバって多いのかなぁ。
ini_get で、mbstring.encoding_translation 見て動作変えるのって、結構重要かも。

ひっさびさの php だ。
何ヶ月ぶりだろ。このブログじゃ初だわw

今までなんとなーく EUC を使ってたんだけど、やっぱ UTF-8 っしょってな具合で重い腰を上げたんですけどね。(重すぎかぁ!?)
やっぱ場当たり的な対応で逃げてるとダメですね。文字にゃ苦労してる割に身になってない・・・。
posted by HiFa at 23:34| 愛知 ??| Comment(0) | TrackBack(0) | ときどきPHP | このブログの読者になる | 更新情報をチェックする