[PHP-users 15457]Re: $HTTP_POST_VARSなどをarray_map()で処理する場合の問題について
Osamu Shigematsu
m5issige @ mr.hitachi-medical.co.jp
2003年 5月 24日 (土) 16:16:40 JST
重松です。こんにちは。
komura さん、詳細な調査とフォロー、ありがとうございます。
> 問題視されている部分を取り違えていたらすみません。
いえ、まさに、その通りです。
> 私の環境でも array_map() では再帰処理はされませんでした。
> array_map() が再起処理を行う訳ではないと思います。
私が試したときに、連想配列の入れ子の深さが、浅すぎて、
再帰処理が行われる、と勝手に思い込んでいたのが誤解の始まりでした。
ソースレベルで見ても再帰的な処理をするようには書かれていないので、
何故、中途半端に入れ子の中身が処理されるのか、
そのルール (原因) を特定できずにいました。
> PHP マニュアルの str_replace のページには、以下のように書かれています。
>
> > mixed str_replace ( mixed search, mixed replace, mixed subject)
> (省略)
> > subject が配列の場合、subject の各エントリについて検索と置換が行われ、
> > 返り値は同様に配列となります。
>
> このため、array_map() が再帰処理を行っているように見えたのかもしれません。
は気づきませんでした。
> 上の部分ではコメントアウトされていますが、おそらく、以下のようにしても
> 同じ処理になると思うのですが、どうでしょうか。
>
> function remove_null($x)
> {
> if (is_array($x)) {
> return array_map('remove_null', $x);
> }
> return str_replace(NUL, '', $x);
> }
そう思います。
こちらの方が、見た目も美しいだけでなくて、
[PHP-users 10914] からのスレッドにあるとおり、
高速に処理可能と思います。
ところで、str_replace() に相当するマルチバイト版の
文字列置換関数はないのでしょうか?
http://www.php.net/manual/ja/re.mbstring.php には、
それらしいものがありませんでしたので。
単に、置換を行ったのでは、少なくとも Shift_JIS の 2 バイト目には、
\ が来ることがあるので、場合によってはデータを壊しそうです。
かといって、mb_ereg_replace を使うと、正規表現をコンパイルする
オーバーヘッドがもったいないかなと思いました。
--
Osamu Shigematsu <m5issige @ mr.hitachi-medical.co.jp>
PHP-users メーリングリストの案内