[PHP-users 15456]Re: $HTTP_POST_VARSなどをarray_map()で処理する場合の問題について
komura
komura @ ma9.seikyou.ne.jp
2003年 5月 24日 (土) 00:25:08 JST
komura です。
問題視されている部分を取り違えていたらすみません。
On Fri, 23 May 2003 17:11:00 +0900
Osamu Shigematsu <m5issige @ mr.hitachi-medical.co.jp> wrote:
> そして、array_map() が、配列を再帰的に走査可能か、という問題ですが、
> 再度私の環境で試したところ、動作しないことが確認できました。
>
> 友人に RedHat 7.x? x86 (DSO, 4.1) でもテストを依頼したところ、
> やはり再帰処理されないことが確認されました。
私の環境でも array_map() では再帰処理はされませんでした。
array_map() が再起処理を行う訳ではないと思います。
> しかし、いろいろ配列の入れ子状態を変えて試しているのですが、
> ルールが今ひとつつかめません。
もし、結果部分の、
> [3]=>
> string(4) "3xxx"
> [4]=>
> string(4) "4xxx"
の部分に remove_null() の処理が行われているのがおかしいという
意味でしたら、これは str_replace() の処理の影響です。
PHP マニュアルの str_replace のページには、以下のように書かれています。
> mixed str_replace ( mixed search, mixed replace, mixed subject)
(省略)
> subject が配列の場合、subject の各エントリについて検索と置換が行われ、
> 返り値は同様に配列となります。
このため、array_map() が再帰処理を行っているように見えたのかもしれません。
以下のスクリプトでも確認しました。
環境は PHP 4.3.2RC4 の CLI 版、OS は RedHat Linux 7.3 です。
<?php
var_dump( str_replace( "\0", "",
array( array( "1\0xxx", "2\0xxx" ), "3\0xxx", "4\0xxx" ) ) );
?>
array(3) {
[0]=>
array(2) {
[0]=>
string(5) "1xxx"
[1]=>
string(5) "2xxx"
}
[1]=>
string(4) "3xxx"
[2]=>
string(4) "4xxx"
}
> function remove_null($x)
> {
> /*
> if (is_array($x)) {
> foreach ($x as $k => $v) {
> $x[$k] = remove_null($v);
> }
> return $x;
> }
> */
> return str_replace(NUL, '', $x);
> }
上の部分ではコメントアウトされていますが、おそらく、以下のようにしても
同じ処理になると思うのですが、どうでしょうか。
function remove_null($x)
{
if (is_array($x)) {
return array_map('remove_null', $x);
}
return str_replace(NUL, '', $x);
}
--
komura <komura @ ma9.seikyou.ne.jp>
PHP-users メーリングリストの案内