[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 メーリングリストの案内